WCF初见

来源:互联网 发布:mac 网游 编辑:程序博客网 时间:2024/05/01 22:42


1.WCF作用


win32中,应用程序是运行在进程(Process)的线程(Thread)中的,.Net平台出现之后,出现了AppDomain(应用程序域),其实就相当于在进程和线程之间又有了一层包装,类似于子进程的概念,在一个进程(或应用程序域)中的对象能进行直接的访问和控制,但超出这个范围,便不能进行直接的访问和控制了,所以进程(或应用程序域)有一定的隔离作用,如果是分布在不同网络,不同操作系统上的不同进程,他们进行通讯的难度就更大,而分布式应用程序要求的就是将原本被隔离的作用域通过一定的契约联系起来,从而达成多个系统的沟通协作。比如在Win32时代,经常使用映射内存文件来实现进程之间的互操作问题,还有在Windows程序中,用Windows消息wm也能实现不同进程之间的通讯问题,但这些都有局限性,因为他们不能很好的解决跨平台,跨网络问题,而WCF可以。


2.WCF体系架构


WCF拥有一个非常灵活的分层体系结构,分布式应用程序可以使用高级API或者低级API编写。高级API或者服务层可以用于调用方法和事件。服务层把这些高级的抽象代码转换为消息,以使用低级API上的信道和端口。

      图1中显示了WCF应用程序的各个层。

              

WCF提供了对可靠性、事务性、并发管理、安全性以及实例激活等技术的有力支持,而这些支持均依赖于如图2所示的WCF构架。

                
      
在客户端,分布式应用通过一个代理来转发对宿主端所提供服务的调用,而代理拥有和服务相同的操作接口,另外还有一些附加的代理管理方法。这也就意味着客户端从来不会直接调用服务,即便这个服务就在本机的内存中。当客户端代理接收到来自客户端的调用请求后,它将消息通过信道链向下传递。每个信道都会执行相应的消息的调用前处理,例如对消息的编码、提供可靠的会话、对消息进行加密等。客户端的最后一个信道则是传输信道,根据配置的传输方式发送消息给宿主。
      
在宿主端,消息同样通过信道链进行传输。与客户端信道相对应,宿主端信道也会对消息执行相应的宿主端的调用前处理,例如对消息的解码、提供会话管理、对消息进行解密等。宿主端的最后一个信道则负责将消息发送给消息分发器(Dispatcher),由分发器负责调用服务的实例。


3.WCF服务框架


宿主(Host),即承载WCF Service运行的环境。可用的宿主环境包括:
(1)
自承载方式:在控制台应用程序与基于WinForm的应用程序中都可以使用这种方式;
(2)
系统服务方式:服务可以随着操作系统的启动而自动启动;
(3) IIS
方式:Web Services的部署方式类似,由请求消息来激活服务,但只支持HTTP方式的绑定;
(4) WAS
Windows Process Activation Service)方式:这个宿主是IIS7的一部分,只有 Windows VistaWindows Server 2008提供默认支持,它支持几乎所有的通讯协议并提供了应用程序池、循环回收、空闲管理、身份管理、隔离等强大的功能。   

     服务类(Service Class)是指一个标记了一些WCF特有的属性的类,它包含了对服务的业务逻辑的具体实现。

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

                                                                             




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

绑定:绑定提供了一种可设置的方式来选择传输协议、消息编码、通讯模式、可靠性、安全性、事务传播以及交互方式等。例如在传输协议上可以选择HTTP/HTTPSTCPP2PIPC甚至是MSMQ等方式。消息编码上可以选择使用纯文本方式来确保互操作能力,或者选择二进制编码来优化性能,或者使用 MTOM来提高负载能力,甚至是自定义编码方式。 WCF中提供了BasicHttpBindingNetTcpBindingNetPeerTcpBindingNetNamedPipeBindingWSHttpBindingWSFederationHttpBindingWSDualHttpBindingNetMsmqBinding以及MsmqIntegrationBinding九种标准类型的绑定。

契约:契约是用来描述服务功能的一种平台中立的标准方式,WCF所有服务都需要实现一个或多个契约。WCF 定义了四种类型的契约:
(1)
服务契约 (Service Contracts): 定义了客户端可以使用哪些服务操作。
(2)
数据契约 (Data Contracts): 定义了服务传输的数据类型。WCF定义了一些隐式数据契约,比如 intstring 等,但更多时候需要使用 DataContractAttribute 显式定义那些自定义类型数据的数据契约。
(3)
错误处理契约 (Fault Contracts): 定义了服务引发的错误信息,以及如何将这些异常传递给客户端。
(4)
消息契约 (Message Contracts): 允许直接操控服务的消息内容和格式。

一般情况下,应当用接口来定义服务契约,尽管也可以使用类。将服务契约定义为接口基于如下几点优点:
(1)
便于契约的继承,不同根的类型可以自由实现相同的契约;
(2)
同一服务类型可以同时实现多个契约;
(3)
类似于接口隔离原则,可以随时修改服务类型的实现而不影响其它实现;
(4)
便于制定版本升级策略,新、旧版本的服务契约可以同时使用而互不影响。

WCF中,对于自承载的服务,端点的相关的信息可以有代码实现与配置文件两种定义方式。而对于IIS承载服务,端点的相关的信息一般定义在虚拟根目录下的Web.Config文件中。一般来讲,使用配置文件来定义端点相关信息是更为灵活、更为推荐的一种方式,其可以在不修改代码、不重新发布系统的情况下对服务的地址、绑定和契约等参数进行修改(因为修改config类型文件的内容是不需要重新编译和重新部署的)。

在下面的代码中具体说明了如何定义宿主端的端点相关信息。其中地址为http://localhost:8080/HelloService,契约为WCFService命名空间下的IEcho接口,绑定采用的是WSHttpBinding方式。值得注意的是,代码中的Service为相对地址,http://localhost:8080/提供的是基址,当然去掉基址直接将address设为http://localhost:8080/Service也是可以的。代码中还添加了名为MyServiceTypeBehaviors的行为配置,其将serviceMetadata节中的httpGetEnabled属性设为了true,目的是为了自动透过 HTTP-GET发布服务的元数据。WCF提供的另外一种发布元数据的方式是使用专门的 MEX端点。

<system.serviceModel> <services>       <service name=" WCFService. Service " behaviorConfiguration="MyServiceTypeBehaviors" >              <endpoint contract="WCFService. IEcho" binding="wsHttpBinding" address="Service"/>              <host>                     <baseAddresses >                            <add baseAddress="http://localhost:8080/"/>                     </baseAddresses>              </host>       </service> </services> <behaviors>        <serviceBehaviors>              <behavior name="MyServiceTypeBehaviors" >                     <serviceMetadata httpGetEnabled="true" />              </behavior>       </serviceBehaviors> </behaviors> </system.serviceModel> 


4.WCF服务模型


           WCF服务通过XML文档进行描述,这些文档主要由三个部分组成:


    • 服务部分说明服务位于何处。

    • 绑定部分说明服务所能理解的标准通信协议。

    • 第三个部分列出服务所能提供的所有操作,它定义了服务根据接收的消息所发出的响应信息。


WCF模型中这三部分被称为:地址(address)、绑定(binding)和契约(contract),为易记起见可简称为ABC,即利用服务模型创建软件通信功能而需要遵循的三个步骤。


建立WCF模型,首先从建立契约开始(主要引用.net Framework里的System.ServiceModel)
先写一个接口interface

public interface IEcho{       stringEcho(string input);}将接口指定为WCF契约[ServiceContract]public interface IEcho{     [OperationContract]       stringEcho(string input);}


接下来就可实现契约接口,自定义类,如果某个类实现了WCF契约接口,它就成为服务类型(service type),并可以通过ServiceBehavior特性给服务类型添加行为来控制。
[ServiceBehavior(ConcurrencyMode =ConcurrencyMode.Multiple)]public classService : IEcho{       string Echo(string input)    { return input; }}


最后将服务承载(host)在一个应用程序域中。IIS和其他任何.NET程序都可以为承载服务提供应用程序域,承载服务使用WCF模型提供的ServiceHost类:


using (ServiceHost host = new ServiceHost(typeof(Service))){    host.Open();    Console.WriteLine("服务已启动...");    Console.ReadKey(true);    host.Close();}

                              


1OneWay:这种消息交换模式在调用方法后会立即返回而不需要等待服务端的消息返回。
2 Request/Reply:这种消息交换模式属于同步调用。在调用服务方法后需要等待服务端的消息返回。
3Duplex:这种消息交换模式具有客户端与服务端双向通信的功能,同时它的实现还可以使消息交换具有异步回调的作用。




0 0
原创粉丝点击