WCF基础—千里之行始于足下(理论篇)

来源:互联网 发布:文件md5加密 java 编辑:程序博客网 时间:2024/06/02 11:28

  1.      基础讲解

    WCF专门用于面向服务开发。在讲解WCF之前,先来理解什么是面向服务?

    Ø  面向服务(Service-Oriented-Architecture)

      定义:SOA是指为了解决在Internet环境下业务集成的需要,通过连接能完成特定任务的独立功能实体实现的一种软件系统架构。SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。

      特点:SOA指出当前系统应该足够灵活,从而允许在不打乱当前成功运行的体系结构和基础结构的前提下,改动已有的体系结构。

      原则:边界清晰;服务自治;兼容性基于策略;共享模式(schma)和契约。

    Ø  WCF简介

      定义:WCF(Windows Communication Foundation)是用于构建面向服务的应用程序的框架 ,是由微软发展的一组数据通信的应用程序开发接口。具体来说就是:WCF为.NetFramework 提供了一个基础,使其能够编写代码,以在组件、应用程序、系统之间进行通信。WCF的设计遵循的是面向服务的原则。服务是指可以通过消息与之进行交互的一段代码。服务是被动的。它们等待传入消息之后才开始工作。客户端是发起者,客户端将消息发送给服务来请求工作。

      特点:

      一、WCF可使用Web服务进行通信,因此与同样支持SOAP的其他平台(例如基于J2EE的主流应用程序服务器)间的互操作性就变得简单明了。

 

      二、还可以对WCF进行配置和扩展,以便与使用并非基于SOAP的消息的Web服务进行通信。

      总而言之:WCF是提供统一的,可用于建立安全、可靠的面向服务的应用的高效开发平台。WCF具有如下的优势:1、统一性;2、互操作性;3、安全与可信赖;4、兼容性。

  2.      内部详解

    学习WCF,我们需要理解一下接口的定义,掌握契约式编程以及服务契约。

    Ø  接口



      如上图就是一个接口,接口的特性是:接口不可以被实例化(常作为类型来使用);实现类必须实现接口的所有方法(抽象类不用实现所有的方法);实现类可以实现多个接口(类是单继承的,但是在java和c#中接口是多继承的);接口中的变量都是静态常量。

    Ø  编程

      编程有面向接口编程,同样有契约式编程,这里讲解概念,下节课进行实例讲解:

      面向接口编程,相应学习过三层或者以及进行机房合作的人来说并不陌生,我们这里不再详解,主要讲述的是契约式编程

      契约合同能保障双方的利益,对客户来说,合同规定了供应者要做的工作;对供应者来说,合同说明了如果约定的条件不满足,供应者没有义务一定要完成规定的任务。该道理同样也适用于软件. 所以,契约式编程是编程的一种方法。


      好处是:引入契约观念之后,这种Client 与 Server 关系被打破,大家都是平等的,你需要我正确提供服务,那么你必须满足我提出的条件,否则我没有义务“排除万难”地保证完成任务。

    Ø  WCF的服务契约

      理解了契约式编程,那么什么又是WCF的服务契约呢?

      服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel通常契约中会有服务契约以及操作契约的定义:ServiceContractAttribute OperationContractAttributeWCF的核心库就是:System.ServiceMod

  3.      如何部署WCF服务

    Ø  使用配置文件进行部署

      服务三要素:

       A:Address 意味着在哪里(也含有传输方式信息)

       B:Binding 意味着怎么做(与地址的传输方式要匹配)

       C:Contract意味着做什么(服务契约)

      如图所示:


      配置服务概述

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>1 <?xml version="1.0"?> 2 <configuration> 3   <system.serviceModel> 4  5      6     <!--服务--> 7     <services> 8       <!--name:名称空间.类型名--> 9       <!--behaviorConfiguration:behavior的名称,请看behavior配置节的名称-->10       <service name="WCFLibrary.User" behaviorConfiguration="MyBehavior">11         <host>12           <baseAddresses>13             <!-- 每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地址组成完整的地址,14                  每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service对外发布服务说明页面的URL -->15             <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFLibrary/Service/"/>16           </baseAddresses>17         </host>18         <!-- 除非完全限定,否则地址将与上面提供的基址相关,每个服务可以有多个Endpoint -->19         <!-- Address:指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的20                       相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress-->21         <!--bindingConfiguration:binding的名称,请看binding配置节的名称-->22         <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser" bindingConfiguration="myHttpBinding">23           <identity>24             <dns value="localhost"/>25           </identity>26         </endpoint>27         <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->28         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>29       </service>30     </services>31 32     33     <!--绑定-->34     <bindings>35       <wsHttpBinding>36         <binding name="myHttpBinding">37           <security mode="None">38             <message clientCredentialType="Windows" />39           </security>40         </binding>41       </wsHttpBinding>42     </bindings>43 44     45     <!--行为-->46     <behaviors>47       <serviceBehaviors>48         <behavior name="MyBehavior">49           <!-- httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据 -->50           <serviceMetadata httpGetEnabled="True"/>51         </behavior>52       </serviceBehaviors>53     </behaviors>54     55   </system.serviceModel>56 </configuration></strong></span>

其中涉及到一个通信协议,除了wshttpbinding之外,还存在其他,且性能比较如下图:


    Ø  WCF的宿主

      WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation Services,Windows进程激活服务)或IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。

      比较常用的有三种宿主:IIS、控制台应用程序宿主、Windows应用程序宿主

    一、IIS宿主

   把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以依靠IIS来管理宿主进程的生命周期。在开发和使用的过程与Web Service非常相似。

    二、控制台应用程序宿主

     配置是直接写在程序中的。

    三、Windows应用程序宿主

    Windows应用程序宿主写在配置文件中的而控制台应用程序宿主配置是直接写在程序中的,区别在于如果写在配置文件中程序运行时直接到配置文件里取出相关的配置节去创建ServiceHost类。下节课将讲解具体的实例。

  4.      通信模式

      通信模式主要分为三种:请求/响应模式;单工模式;双工模式。

     第一种:请求/响应模式(同步)

      请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应。这也意味着在接收到服务的响应以前,客户端不会继续执行操作。

      特点:

       1、请求/响应模式是默认的消息模式。

       2、返回值是void,也属于请求/响应消息交换。

      3、除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。

     缺点

          如果执行操作需要很长的时间,则会降低客户端性能和响应能力。

     优点

          响应消息中可返回SOAP 错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况。

    示例:

[OperationContract]string getOrders(DateTime dt);

      第二种:单工模式

      单向通信应是指通信只在一个方向进行,即从客户端流向服务。服务不会发送响应,而客户端也不会期望会有响应。这种情况下,客户端发送消息,然后继续执行。

      单向操作是客户端调用操作并在WCF 将消息写入网络后继续进行处理的操作。通常这意味着,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。

      若要为返回void的操作指定单向消息交换,请将IsOneWay属性设置为true,默认为false.

      示例:

[OperationContract(IsOneWay=true)]void insertEmp(Employee emp);

     第三种:双工模式(异步)

     双工模式的特点是,无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。对于必须直接与客户端通信或向消息交换的任意一方提供异步体验(包括类似于事件的行为)的服务来说,这种双向通信形式非常有用。

     若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的ServiceContractAttribute 属性(attribute)的CallbackContract 属性(property)。 

     若要实现双工模式,您必须创建第二个接口,该接口包含在客户端调用的方法声明。

     示例:

[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IServiceDuplexCallback))]public interface IServiceClass{[OperationContract(IsOneWay = true)]void AddNumber();}public interface IServiceDuplexCallback{[OperationContract(IsOneWay = true)]void Calculate(double result);}

  5.      小结

    这里我们主要讲述的是WCF的一些理论,下篇我们来讲解应用,敬请期待~



0 0