首页 > 代码库 > WCF简介

WCF简介

        WCF是Windows Communication Foundation的缩写,是为SOA(Service Oriented Architecture)而设计的一套完整的技术框架。用它可以开发出分布式(Distributed)的应用程序,它也是目前微软平台下最先进的SOA框架,具有很多优点。

WCF体系架构:

                  技术分享

契约模型:

        契约是一个服务公开接口的一部分,它定义了服务端公开的方法、传输时的协议、访问的地址、传输的消息格式

服务运行时模型:

        定义服务在运行时的具体行为

消息传输模式:

        包含消息的传输方式,使用何种信道、消息的编码格式,使用二进制、还是xml等。注意的是具体的传输形式要符合在契约中绑定的协议。

激活与宿主环境:

        WCF服务需要在一个运行的程序中寄宿,常用的方式有四种。

WCF客户端和服务端模型:

                技术分享

        端点(Endpoints)是WCF实现通信的核心要素,客户端和服务端都通过端点来交换消息,WCF 允许我们为服务添加多个绑定和端点。端点由地址(Address)、绑定(Binding)以及契约(Contract)三部分组成,在WCF中,类ServiceEndpoint代表了一个Endpoint,类中包含的EndpointAddress,Binding,ContractDescription类型分别对应端点中的AddressBinding以及Contract

        Address:每个服务都会关联到一个唯一的地址,因此地址定位唯一标志了一个端点,主要提供两个重要信息: 服务位置以及传送协议。在WCF 中,地址由System.ServiceModel.EndpointAddress对象来表示,其包括URI、Identity、Headers三个要素。

        Binding:绑定提供了一种可设置的方式来选择传输协议、消息编码、通讯模式、可靠性、安全性、事务传播以及交互方式等。例如在传输协议上可以选择HTTP/HTTPS、TCP、P2P等方式。消息编码上可选择纯文本方式、自定义、XML等。

        Contract:契约是用来描述服务功能的一种平台中立的标准方式,WCF 所有服务都需要实现一个或多个契约,有四种类的契约: 

(1) 服务契约 (Service Contracts): 定义了客户端可以使用哪些服务操作。 

(2) 数据契约 (Data Contracts): 定义了服务传输的数据类型。WCF 定义了一些隐式数据契约,比如 int、string 等。

(3) 错误处理契约 (Fault Contracts): 定义了服务引发的错误信息,以及如何将这些异常传递给客户端。

(4) 消息契约 (Message Contracts): 允许直接操控服务的消息内容和格式。

       元数据是用来描述服务的特征,外部实体需要了解这些特征以便与该服务进行通信。服务的元数据包括XML、架构文档(用于定义服务的数据协定)和WSDL文档(用于描述服务的方法)。启用元数据后,WCF通过检查服务及其终结点自动生成服务的元数据。

        Proxy,WCF不允许客户端直接与服务交互,客户端使用Proxy将调用转发给服务。即使对象是本地的,WCF仍然使用远程编程模型的实例化方式,并且使用Proxy

WCF的通道栈模型:

                    技术分享

        首先,代理与客户端的交互意味着WCF总是处于服务与客户端之间,拦截所有的调用,执行调用前和调用后的处理。当代理将调用栈帧(Stack Frame)序列化到消息中,并将消息通过通道链向下传递时,WCF就开始执行拦截。通道相当于一个拦截器,目的在于执行一个特定的任务。每个客户端通道都会执行消息的调用前处理。链的组成与结构主要依赖于绑定。例如,一个通道对消息编码(二进制格式、文本格式或者MTOM),另一个通道传递安全的调用上下文;还有一个通道传播客户端的事务,一个通道管理可靠会话,另一个通道对消息正文(Message Body)加密(如果进行了配置),诸如此类。客户端的最后一个通道是传输通道,根据配置的传输方式发送消息给宿主。

       其次,在宿主端,消息同样通过通道链进行传输,它会对消息执行宿主端的调用前处理。宿主端的第一个通道是传输通道,接收传输过来的消息。随后的通道执行不同的任务,例如解密、解码、参与传播事务等。宿主端的最后一个通道负责将消息传递给分发器(Dispatcher)。分发器将消息转换到一个栈帧,并调用服务实例。

        事实上,服务并不知道它是否被本地客户端调用,而是被本地客户端 —— 分发器调用。客户端与服务端的拦截器确保了它们能够获得运行时环境,以便于它们执行正确的操作。服务实例会执行调用,然后将控制权(Control)返回给分发器。分发器负责将返回值以及错误信息(如果存在)转换为一条返回消息。分发器获得控制权,执行的过程则刚好相反:分发器通过宿主端通道传递消息,执行调用后的处理,例如管理事务、停用实例、回复消息的编码与加密等。为了执行客户端调用后的处理,包括解密、解码、提交或取消事务等任务,传输通道会将返回消息发送到客户端通道。最后一个通道将消息传递给代理。代理将返回消息转化到栈帧,然后将控制权返回给客户端。

总结:

        整理这些东西的时候,我发现自己虽然用了WCF,但是对这个东西还是不能理解,在查阅资料的时候,我发现WCF就像一个无底洞,越理越多,自己太浅陋了。

WCF简介