今天我们学习WCF4.0新特性体验(2):简化配置(默认Endpoints、Binding和 Behavior)。WCF4.0为了简化服务配置,提供了默认的终结点、绑定和服务行为。也就是说,在开发WCF服务程序的时候,即使我们不提供显示的服务终结点,WCF框架也能为我们的服务提供一些默认配置功能的服务终结点。当然也包含默认的绑定和默认的服务行为。这一切都是为了简化配置过程,避免一些不必要的错误。
下面我们就来通过代码示例来体验一下WCF4.0提供简化配置的功能。
【1】默认终结点:
也叫Default Endpoints。指的是,如果开发人员没有为服务显示配置服务终结点(Endpoints)。WCF4.0会根据已有的基地址,产生针对每个基地址一个默认的终结点。
(1)WCF3.5:我们知道在以前的WCF开发中,比如WCF3.5中,如果我们想要配置一个服务终结点,必须提供明确的Address、Binding和Contract,也就是ABC。任何一个缺少都会导致运行时错误。代码如下:
<service name="WCFService.WCFService">
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
contract="WCFService.IWCFService">
</endpoint>
</service>
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
contract="WCFService.IWCFService">
</endpoint>
</service>
当然如果你提供了baseAddress,这里的地址可以使用相对地址。
(2)WCF4.0:
现在WCF4.0里,只要你提供了一个服务的基地址,即使没有服务终结点配置,WCF框架会自动根据基地址创建一个默认的终结点,也就是Default Endpoint。请看下面的服务配置信息:
<service name="WCFService.WCFService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
</service>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
</service>
WCF4.0里我们只要指定一个
baseAddress,就可以了,这里指定了2个服务的
baseAddress。按照道理WCF框架会为我们产生2个默认的终结点。运行代码结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/569c4a5d5f059c59be4e75d7d9e033ca.png)
这里我们能看到根据已有的
baseAddress,产生的2个服务终结点。 如果我们把2个基地址也去除,运行WCF Host程序,就会出现没有终结点的错误。这里针对每个不同的基地址,WCF4.0提供了不同的默认绑定。比如Http,提供的是basicHttpBinding。而net.Tcp,是用的则是netTcpBinding。
(3)如果我们显示指定服务的终结点,那么WCF就不会基于
baseAddress
产生新的默认的终结点。修改配置代码如下:
<service name="WCFService.WCFService">
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
contract="WCFService.IWCFService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
</service>
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
contract="WCFService.IWCFService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
</service>
这里我们能看到根据已有的
baseAddress,产生的2个服务终结点。 如果我们把2个基地址也去除,运行WCF Host程序,就会出现没有终结点的错误。这里针对每个不同的基地址,WCF4.0提供了不同的默认绑定。比如Http,提供的是basicHttpBinding。而net.Tcp,是用的则是netTcpBinding。
(3)如果我们显示指定服务的终结点,那么WCF就不会基于
baseAddress
产生新的默认的终结点。修改配置代码如下:
<service name="WCFService.WCFService">
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
contract="WCFService.IWCFService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
</service>
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
contract="WCFService.IWCFService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
<add baseAddress="net.tcp://localhost:8001/"/>
</baseAddresses>
</host>
</service>
这时在运行WCF Host程序,就不会产生新的默认的终结点。运行结果如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/c133ac3fb7da2ee357bc4da16584abc9.png)
(4)强制为每个基地址添加默认终结点:
这里就产生一个问题,如果我们想为每个基地址
baseAddress,保留产生的默认的服务终结点,还想添加自己的服务终结点怎么办呢?因为之前WCF服务提供了显示的终结点以后,默认服务终结点就消失了。这个时候我们可以通过调用Host的AddDefaultEndpoints()方法实现这一目的。此方法的目的会为服务里每个基地址产生一个终结点。绑定也是使用默认的配置。代码就是:host.AddDefaultEndpoints();新的运行结果如下,这里理论上,我们会得到3个服务终结点:2个默认+1个显示配置。运行程序结果如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/ad0d9a4922054885c9a82b35e5123eba.png)
【2】绑定协议映射:
也称作Default Protocol Mapping。WCF提供针对绑定协议的映射机制,用来简化配置。我们可以在服务配置里指定某个地址结构映射到特定的绑定上,WCF会自动在服务里更新匹配该地址结构的默认终结点的绑定为映射的绑定。
这里把这个概念放到此处,因为可以根据上面的例子来掩饰,很简单。要使用绑定映射功能。我需要在服务里指定使用的映射。配置文件里独立一个节点,我们可以在其内部指定此Solution里使用的服务的绑定映射。配置代码如下:
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMsmqBinding"/>
</protocolMapping>
</system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMsmqBinding"/>
</protocolMapping>
</system.serviceModel>
注意上图运行结果,基于http基地址产生的默认终结点,使用的绑定是basicHttpBinding。我们这里为了测试,把http的映射修改为webHttpBinding,然后启动Host程序,再来观察一下结果。运行结果如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/85ead770e78e6fe16fe3460e60c1397c.png)
观察上面第二个终结点,绑定已经变为webHttpBinding。
【3】默认绑定配置:
也称作Default Binding Configurations。我们可以提供某种类型的绑定的配置,但是如果不把这个绑定配置应用到特定的服务终结点上。WCF会默认把所有匹配该绑定的终结点,全部应用刚才的绑定配置。
例如,我们为wsHttpBinding启用了消息安全模式,并且客户端认证方式为证书,一般的做法是我们定义个绑定配置。代码如下:
<wsHttpBinding>
<binding name="wsHttpBindingSecurity">
<security mode="Message">
<transport clientCredentialType="None">
</transport>
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
<binding name="wsHttpBindingSecurity">
<security mode="Message">
<transport clientCredentialType="None">
</transport>
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
然后在把这个绑定配置应用到特定的服务终结点上,例如:
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
bindingConfiguration="wsHttpBindingSecurity"
contract="WCFService.IWCFService">
</endpoint>
address="http://localhost:8000/WCFService"
binding="wsHttpBinding"
bindingConfiguration="wsHttpBindingSecurity"
contract="WCFService.IWCFService">
</endpoint>
这样才能对此终结点启用绑定配置的安全要求。但是现在在新的WCF机制下。我们不需要把配置应用到默认的终结点上。简单的配置如下:
<wsHttpBinding>
<binding >
<security mode="Message">
<transport clientCredentialType="None">
</transport>
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
<binding >
<security mode="Message">
<transport clientCredentialType="None">
</transport>
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
这些配置会作用到匹配wsHttpBinding的默认的服务终结点上。
【4】默认行为配置:
也称作Default Behavior Configurations。WCF允许你定义一个服务行为,该服务行为会默认匹配到该运行在此机器上的全部该解决方案的全部服务(或者终结点)。
这里终结点行为也是可以提供默认配置的。在WCF4.0以前,我们定义服务或者终结点行为,需要指定name,然后通过behaviorConfiguration来使用定义的行为。现在在WCF里,以服务行为为例,我们这里的定义不包含名称。配置代码如下:
<serviceBehaviors>
<behavior >
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<behavior >
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
服务的配置非常简单,我们这里只使用一个baseAddress。配置信息如下:
<services>
<service name="WCFService.WCFService" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
</service>
</services>
<service name="WCFService.WCFService" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
</service>
</services>
这里我们也就启用了服务元数据交换,为了检查这个默认服务
behavior
设置,会不会作用到我们的服务上,现在我们来运行Host,然后在浏览器里查询服务元数据。在WCF3.5里不显示配置,应该是不可以查看的元数据的。这里我们打开浏览器,输入元数据地址,查看信息如下:
![](https://i-blog.csdnimg.cn/blog_migrate/455400478b1277a3f17d6413b0b5c434.png)
默认情况下,这个配置会对所有的服务或终结点起作用。如果我们把配置信息放置在machine.config,则会作用于机器上所有托管的服务或者终结点。如果是app.config,则只影响本托管程序里的服务行为。
【总结】
以上就是关于WCF4.0默认终结点、绑定和服务行为的介绍。希望对大家的学习有所帮助。下一节我们会介绍一下WCF4.0提供的Standard endpoints,也就是标准终结点。
本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/320316
,如需转载请自行联系原作者