绑定
服务之间的通信方式多种多样,传输协议多种多样,消息编码格式多种多样,消息安全保障策略多种多样...等等这些如果组合起来,其数量非常之多,并且组合这些选项,有的彼此约束,有的互斥。对大多数应用程序而言,管理这么复杂的组合并无商业价值。然而,一旦做出错误的组合,就会影响系统的性能,质量,造成严重的后果。
为了简化这些选项,方便管理,WCF引入了绑定(binding),将这些通信特征组合在一起。
WCF定义了五种常用的绑定。
- 基本绑定
对应于BasicHttpBinding类。基本绑定使得服务看起来像是一个传统的Web服务,能够基于基本的Web服务信息进行通信。
- TCP绑定
对应于NetTcpBinding类。TCP绑定使用TCP协议实现在Intranet中跨机器的通信。
- IPC绑定
对应于NetNamedPipeBinding类。它使用命名管道为同意机器通信进行传输。
- Web服务绑定
对应于WSHttpBinding类。
- MSMQ绑定
对应于NetMsmqBinding类。
有三种使用绑定的方式:(1)如果满足需要,可以直接使用内置的绑定类型;
(2)重新配置绑定的属性;
(3)编写自定义绑定;
终结点(Endpoints)
服务与地址,绑定,契约有关。其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约则定义了服务的内容。所以,可以这样理解,终结点就是地址,绑定,契约的混合体(ABC)。
每一个终结点都包含了三个元素,而宿主则负责公开终结点。从逻辑上讲,终结点相当于服务的接口。
每个服务至少公开一个业务终结点,每个终结点有且只能有一个服务契约。
Address
地址的三个典型功能(服务标识/定位,辅助寻址和服务身份标识)分别对应Uri,Headers和Identity三个只读属性。
元数据交换终结点
默认情况下,服务不会发布其元数据,那么如何获得元数据?
有两种方式可以发布服务的元数据:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议;另一种是元数据交换终结点。
- 基于HTTP-GET协议
不发布元数据,我们当然就用不了服务,使用HTTP-GET协议,那么基地址中必须有一个http协议的,假如有这么一种情况,需要用HTTP-GET协议发布服务的元数据,但是通信却使用TCP,那么至少有两个基地址
以下App.config配置如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="WCFServer.MyService" behaviorConfiguration="MEX"> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:5566/"/> <add baseAddress="http://localhost:6655/"/> </baseAddresses> </host> <endpoint address="HelloWorld" binding="netTcpBinding" contract="WCFServer.IMyService"/> <!--<endpoint address="MEX" binding="mexTcpBinding" contract="IMetadataExchange"/>--> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MEX"> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
- 元数据交换终结点
基于HTTP-GET发布元数据仅仅是WCF的一个特性,它并不保证其他交互平台也会支持。元数据发布具有标准形式,即元数据交换终结点,称为MEX终结点。
既然是终结点,那么就有address,binding,contract,只不过contract是IMetadataExchange。下面配置为使用元数据交换终结点的配置
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="WCFServer.MyService" behaviorConfiguration="MEX"> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:5566/"/> </baseAddresses> </host> <endpoint address="HelloWorld" binding="netTcpBinding" contract="WCFServer.IMyService"/> <endpoint address="MEX" binding="mexTcpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MEX"> <serviceMetadata/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
- 标准终结点
WCF提供了几个预定义的服务终结点,即标准终结点,配置如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="WCFServer.MyService" behaviorConfiguration="MEX"> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:5566/"/> </baseAddresses> </host> <endpoint address="HelloWorld" binding="netTcpBinding" contract="WCFServer.IMyService"/> <endpoint address="MEX" binding="mexTcpBinding" kind="mexEndpoint"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="MEX"> <serviceMetadata/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>