微软服务器与开发工具事业部 熊炜
原为地址:http://blogs.msdn.com/b/wcftoolsteamblogcn/archive/2010/06/04/wcf-4-0.aspx?CommentPosted=true#commentmessage
自从WCF
问世以来, WCF服务的配置一直是广大开发人员所关心的话题。由于WCF作为一个通用服务框架,拥有大量的拓展点,您有时会觉得配置文件过于复杂。在WCF 4.0中,根据各方面收集的用户反馈,WCF团队对WCF的配置做了大量的简化工作,以方便您更快更好的配置WCF服务。下面会给大家主要介绍以下几点:
1.
缺省服务配置
我们都知道,在WCF3.0或3.5中,对每一个服务我们都必须要详细地定义地址,绑定(binding),契约(contract),行为(behavior)等一系列的配置,缺一不可。而在WCF4.0中,配置文件中增加了许多缺省选项:从终结点,到绑定,各种行为,都可以被省略。下面是一个简单的WCF服务,运行这个服务甚至不需要配置文件:
namespace ConsoleApplication1
{
class
Program
{
static
void Main(string[] args)
{
using (ServiceHost host =
new ServiceHost(typeof(Service1),
new Uri("http://localhost/Service1")))
{
host.Open();
ServiceEndpoint endpoint = host.Description.Endpoints[0];
Console.WriteLine("Address: {0}\nBinding: {1}", endpoint.Address, endpoint.Binding);
Console.ReadLine();
}
}
}
[ServiceContract]
class
Service1
{
[OperationContract]
public
void DoWork()
{
}
}
}
运行这个程序结果如下所示:

可以看到,虽然我们在程序中并没有添加终结点,也没有指定绑定,但WCF还是智能地为我们做了这两项配置,那WCF是通过怎样的机制来做这项设定的呢?
1.1.
缺省的终结点和绑定
事实上,WCF4.0框架会自动检测当前将要运行的服务的终结点个数。根据用户反馈,不少程序员会忘记往当前服务中添加终结点,结果自然是在服务运行的时候跳出错误。在4.0中,如果您指定了服务类型和服务的基本地址,WCF会用这个地址为您自动添加一个终结点。
我们同时可以看到,WCF为这个服务自动选定了BasicHttpBinding。是的,WCF会根据当前URI地址的前缀(在这里是http://),自动挑选对应的缺省绑定。下面是几个常见前缀的默认绑定表:
前缀
|
绑定
|
Http
|
BasicHttpBinding
|
Net.tcp
|
NetTcpBinding
|
Net.Pipe
|
NetNamedPipeBinding
|
值得注意的是,如果您为您的服务添加了两个不同的基本地址,WCF会为这两个地址分别添加一个终结点。如果这两个终结点地址的前缀不同的话,您就会自动拥有了两个不同绑定的终结点。
如果您希望改动这里的缺省绑定对应,比如,希望用WsHttpBinding来作为Http前缀的缺省绑定,您只需要在配置文件中添加如下语句:
<system.serviceModel>
<protocolMapping>
<add
scheme="http"
binding="wsHttpBinding"/>
</protocolMapping>
</system.serviceModel>
如果您熟悉WCF ABC (Address,Binding,Contract)话一定会还有一个小疑问:那这边的契约是怎么定义的呢?相信大家一定能够想到,如果当前服务实现了多个WCF
服务接口,WCF会为每一个接口创建一个新的终结点。这边这些终结点会共用一个服务地址和绑定。由于彼此契约不同,这样的行为并不会引起任何冲突。
1.2.
默认的绑定/行为设定
在WCF3.0或3.5中,您需要为您的每一个绑定或者行为取一个名字,然后您的每个终结点需要指定某个定义好的绑定或行为来进行应用。可以想象,当您有几十个甚至几百个服务同时应用相同的绑定或行为的时候,指定这些名字将成为单纯的体力劳动。为了避免这样的情况,WCF4.0
引入了默认绑定/行为的设定。下面是一个默认绑定的例子:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding>
<security
mode ="Message">
<message
clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
请注意这边我们在定义绑定的时候并没有给这个绑定取名字!在WCF 3.0或3.5版本中是不合法的,但在4.0中,这样的行为表示默认设定。也就是说在当前配置文件中其他用到WsHttpBinding的服务,如果没有指定对应的绑定,那么就会自动采用这个默认绑定,即拥有采用用户名密码认证模式的消息级安全设定。这样的设定方式无疑能够大大的简化程序员的工作量。
WCF的默认行为设定和默认绑定设定的方式类似。同样,如果您在定义完您的服务级行为或者终结点级行为后不特别取一个名字,那么这个行为就能够直接为您所有没指定行为的服务或终结点所采用。
Frank Xu Lei--谦卑若愚,好学若饥
专注于.NET平台下分布式应用系统开发和企业应用系统集成
Focus on Distributed Applications Development and EAI based on .NET
【老徐的网站】:http://www.frankxulei.com/
【老徐的博客】:http://www.cnblogs.com/frank_xl/
【WCF中文技术论坛】:微软WCF中文技术论坛
【WCF英文技术论坛】:微软WCF英文技术论坛