WCF基本概念
WCF是基于Windows平台下开发和部署服务的SDK。服务是一组公开的功能集合。
面向服务(Service Orientatio,SO)是一组原则的抽象,
面向服务的应用程序(SOA)将众多服务聚集到一个单一逻辑的应用程序中。
1.服务的执行边界
WCF不允许客户端直接与服务交互,客户端总是使用代理(proxy)将调用转发给服务。
代理公开的操作与服务相同,同时还增加了一些管理代理的方法。代理可以拦截WCF的请求,并增加WCF的价值。
WCF允许客户端跨越执行边界和服务通信。在同一机器中,客户端可以调用同一个应用程序域中的服务,也可以在同一进程中跨应用程序域调用,甚至跨进程调用。
跨越机器边界通信是指客户端可以与服务跨越Internet(互联网)或者Intranet(局域网)交互。
2.地址
每一个服务都有唯一的地址,地址包含两个重要的元素:服务位置和传输协议,
服务位置包含:目标机器名,站点(或者网站),通信端口,管道(或者是队列),以及一个可选的特定路径或URI。
传输协议:Http(s),TCP,IPC,Peer network,MSMQ,Service bus
地址格式:[基地址]/[可选的URI]
基地址格式:[传输协议]://[机器名或域名][:可选端口]
=>[传输协议]://[机器名或域名][:可选端口] /[可选的URI]
eg:http://localhost:8001/MyService
读作:采用Http协议访问localhost机器,MyService服务在8001端口处等待用户的调用。
3.托管
1) IIS 5/6托管
此版本的IIS托管只能使用Http协议,如果是IIS5,还受端口限制,要求所有服务必须使用相同的端口号。服务的基地址必须与.svc文件的地址相同。此托管无法满足Intranet内部的访问。
2) 自托管
由开发组提供和管理宿主进程的生命周期的一种方式。客户端调用自托管的服务时,该服务进程必须先启动。
3) WAS托管
WAS:Window激活服务,新一代Windows系统中通用的托管引擎。
WAS确实是通用的宿主引擎,可以托管网站(实际上IIS7默认使用WAS托管网站),可以方便地托管服务,允许使用任何传输协议,如TCP,IPC,MSMQ等,可以单独安装或者配置WAS,不需要和IIS7一起使用。托管WCF服务需要提供svc文件
4) IIS/WAS里的自定义托管
如果需要直接与宿主交互,WCF提供了一个叫做“宿主工厂”的hook,在svc文件里直接使用Factory标签,可以提供自定义创建宿主的类。
5) Windows Server AppFabric
WAS并不知道托管的是WCF服务还是网站,对WCF服务也不会做什么优化工作。为了处理这个问题,可以安装WAS扩展程序,即Windows Server AppFabric(需要安装IIS7.5及以上),此扩展程序的设计目的就是为WCF和WF提供监控、显示,以及事件跟踪等额外的配置选项。
Windows Server AppFabric在第一个客户端请求到来之前就已经启动服务。
WAS会在第一个客户端请求到来后再启动服务宿主进程。
4.绑定
一个绑定封装了注入传输协议、消息编码、通信模式、可靠性、安全性、事物传播,以及互操作性等相关选项。理想状态下,希望将所有繁杂的基础功能模块从服务代码中解放出来,让服务只需要关注业务逻辑的实现。绑定使得开发者能够基于不同的基础功能模块使用相同的服务模块。单个服务能够支持各个地址上的多个绑定。
WCF定义了五种常用的绑定
1) 基本绑定:BasicHttpBinding。
2) TCP绑定:NetTcpBinding,要求客户端与服务都必须使用WCF。
3) IPC绑定:NetNamePipeBinding,在同一机器通信进行传输,性能最佳,最安全。
4) Web服务(WS)绑定:WSHttpBinding
5) MSMQ绑定:NetMsmqBinding
5.终结点
服务与地址、绑定及契约有关。其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约定义了服务的内容。每一个终结点都包含了这三个元素,而宿主负责公开终结点,从逻辑上讲,终结点相当于服务的接口。
每个服务至少必须公开一个业务终结点,每个终结点有且只能拥有一个服务契约。
默认绑定配置:默认绑定会影响使用此配置文件的应用程序里的所有服务,不需要使用名称,每个绑定类型最多有一个默认绑定。
<netTcpBinding>
<binding transactionFlow=”true” />
</netTcpBinding>
默认终结点
如果服务宿主没有定义终结点,只提供了一个基地址,则WCF将会为服务添加默认的终结点。WCF会为每个基地址、每个契约添加终结点,使用基地址作为服务地址。WCF会根据基地址的scheme来推断绑定类型。WCF也会通过连接绑定和契约名字来命名终结点。
协议映射
<system.serviceModel>
<protocolMapping>
<add scheme=”http” binding=”wsHttpBinding” />
</protocolMapping>
</system.serviceModel>
6.元数据交换
1) 基于HTTP-GET的元数据
基于HTTP-GET交换元数据就是一种服务行为,服务添加此行为就能够自动提供基于HTTP-GET的元数据。
<behavior>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl="MyMexAddress"/>
</behavior>
2) 元数据交换终结点
公开元数据交换终结点,用户只需要指定使用的地址和绑定,并添加服务元数据行为即可,serviceMetaData标签,通常情况下不用为它添加值。
标准终结点:WCF为元数据交换、服务发现、服务通告、工作流和Web分别提供了标准终结点。
<service name="StandardEndPoint.Service1">
<endpoint address="MyService" binding="basicHttpBinding" contract="StandardEndPoint.IService1"></endpoint>
<endpoint kind="mexEndpoint" address="httpmex"></endpoint>
</service>
7.传输会话层
传输会话:它确保了来自一个特定客户端的消息被发送到宿主的相同传输通道上。传输层会话是可选的,它只是绑定配置中的一个设置,它会影响到可靠性、实例管理、错误管理、同步、事物和安全。
TCP和IPC绑定都支持传输会话,basicHttpBinding不具备传输会话,WSHttpBinding绑定通过为每条消息插入唯一的ID识别客户端,客户端每次调用发送该ID来维持传输会话。
传输会话通常会在客户端关闭代理时终止。当客户端强制关闭或者通信错误而断开时,每个传输会话具有一个空闲时间的超时值,默认为10min。
<netTcpBinding>
<binding name="tcpsession">
<reliableSession inactivityTimeout="00:25:00"/>
</binding>
</netTcpBinding>
8.可靠性
WCF与其他面向服务技术之间的最大区别在于传输可靠性和消息可靠性。
传输可靠性:在网络数据包层提供了点对点保证传递,以确保数据包的顺序无误。
消息可靠性:负责处理消息层的可靠性,它提供了端对端担保传递,确保消息的顺序无误。为了实现基于消息的可靠通信,该标准维持了一个传输会话层。
OSI七层结构:
7 应用层
6 表示层
5 会话层
4 传输层
3 网络层
2 数据链路层
1 物理层
NetTcpBinding,WSHttpBinding支持可靠性,默认禁用;支持有序传递,默认启用。
WSDualHttpBinding支持可靠性,默认启用;支持有序传递,默认启用。
NetNamedPipeBinding可靠性固有。
WCF允许开发者只启用可靠性,而不启用有序传递。有序传递依赖于可靠性,如果启用了有序传递却禁用了可靠性,调用就不会按顺序传递。
配置可靠性
<bindings>
<netTcpBinding>
<binding name="reliabletcp">
<reliableSession enabled="true"/>
</binding>
</netTcpBinding>
</bindings>