WCF简单实例详解

  • xfserver:是一个类库项目,定义服务契约(Service Contract),提供对WCF服务的实现。定义在该项目中的所有WCF服务实现了定义在Contracts中相应的服务契约,该项目引用System.ServiceMode程序集;

    WCF采用基于契约的交互方式实现了服务的自治,以及客户端和服务端之间的松耦合。WCF包含四种类型的契约:服务契约、数据契约、消息契约和错误契约,这里着重于服务契约。从功能上讲,服务契约抽象了服务提供的所有操作;而站在消息交换的角度来看,服务契约则定义了基于服务调用的消息交换过程中,请求消息和回复消息的结构,以及采用的消息交换模式。通过接口的形式定义服务契约:

  •  [ServiceContract]
        public interface IFirstService //定义接口
        {
            [OperationContract]
           String GetData(String name); //不需要public
        }

  • 当服务契约成功创建时,我们需要通过实现服务契约来创建具体的WCF服务。WCF服务FirstService定义在本项目中,实现了服务契约接口IFirstService,实现了所有的服务操作。FirstService定义如下:

  • public class FirstService : IFirstService//实现接口
        {
         public   string GetData(String name)//需要public
            {
                return String.Format("Hello {0},Welcome To WCF!", name);
            }
        }

  • Host一个控制台(Console)应用,实现对定义在xfserver项目中的服务的寄宿,该项目须要引用xfserver项目和System.ServiceMode程序集,由于WCF的服务不能孤立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。在我们的服务应用中,可以采用了两种服务寄宿方式:通过自我寄宿(Self-Hosting)的方式创建一个控制台应用作为服务的宿主(寄宿进程为Host.exe);通过IIS寄宿方式将服务寄宿于IIS中(暂不介绍)。

    服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成,由于三要素应为首字母分别为ABC,所以就有了易于记忆的公式:Endpoint = ABC。一个终结包含了实现通信所必需的所有信息。

  • 地址(Address):地址决定了服务的位置,解决了服务寻址的问题;
  • 地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定。URI由通讯协议和位置路径两部分组成,如示例一中的:
    http://localhost:8000/
    表明通讯协议为http,位置是localhost(本机)的8000端口。
        注意上述提到的消息是指一个独立的数据单元,一般由消息正文和消息头组成,而服务端与客户端的交互都是通过消息来进行的。
        WCF中支持的传输协议包括HTTP、TCP、Peer network(对等网)、IPC(基于命名管道的内部进程通信)以及MSMQ(微软消息队列),每个协议对应一个地址类型:
        HTTP地址
            即使用HTTP协议进行传输(包括https安全传输协议)。其地址形式为
            http://localhost:8000/
            如果地址中为制定端口号,则默认端口为80

        TCP地址
            使用TCP协议进行传输,其形式为:
            net.tcp://localhost:8000/

        IPC地址
            使用net.pipe进行传输,其形式为:
            net.pipe://localhost/

        MSMQ地址
            使用Microsoft Message Queue机制进行传输,其形式为:
            net.msmq://localhost/

        对等网地址
            使用net.p2p进行传输,其形式为:
            net.p2p://localhost/

  • 绑定(Binding):绑定实现了通信的所有细节,包括网络传输、消息编码,以及其他为实现某种功能(比如安全、可靠传输、事务等)对消息进行的相应处理。WCF中具有一系列的系统定义绑定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等;
  • 绑定定义终结点与外界进行通讯的方式,它由一组称为绑定元素的要素构造而成,绑定最起码应该定义传输协议(如http、TCP等)和所使用的编码方式(如文本或二进制等)
    绑定元素
        绑定元素表示绑定的特定部分,如传输协议、编码、基础结构级协议(如 WS-ReliableMessaging)的实现以及通信堆栈的其他任何要素。
    预定义绑定
        即WCF基库中提供的绑定。 这些绑定是针对特定方案进行优化的绑定元素的集合。 例如,WSHttpBinding 是为了与实现各种 WS* 规范的服务进行互操作而专门设计的。 通过仅提供那些可以正确应用于特定方案的选项,这些预定义的绑定可以节省时间。 如果预定义的绑定不能满足您的要求,则可以创建您自己的自定义绑定。示例一中我们使用了basicHttpBinding预定义绑定。
    下面列表包含了当前WCF基库中预定义的所有绑定

    绑定配置元素说明传输协议编码格式
    BasicHttpBinding<basicHttpBinding>一个绑定,适用于与符合 WS-Basic Profile 的 Web 服务(例如基于 ASP.NET Web 服务 (ASMX) 的服务)进行的通信。 此绑定使用 HTTP 作为传输协议,并使用文本/XML 作为默认的消息编码。HTTP/HTTPSText,MTOM
    WSHttpBinding<wsHttpBinding>一个安全且可互操作的绑定,适合于非双工服务约定。HTTP/HTTPSText,MTOM
    WS2007HttpBinding<ws2007HttpBinding>一个安全且可互操作的绑定,可为 Security, ReliableSession 的正确版本和 TransactionFlow 绑定元素提供支持。HTTP/HTTPSText,MTOM
    WSDualHttpBinding<wsDualHttpBinding>一个安全且可互操作的绑定,适用于双工服务协定或通过 SOAP 媒介进行的通信。HTTPText,MTOM
    WSFederationHttpBinding<wsFederationHttpBinding>一个安全且可互操作的绑定,支持 WS 联合协议并使联合中的组织可以高效地对用户进行身份验证和授权。HTTP/HTTPSText,MTOM
    WS2007FederationHttpBinding<ws2007FederationHttpBinding>一个安全且可互操作的绑定,它派生自 WS2007HttpBinding 并支持联合安全性。HTTP/HTTPSText,MTOM
    NetTcpBinding<netTcpBinding>一个安全且经过优化的绑定,适用于 WCF 应用程序之间跨计算机的通信。TCPBinary
    NetNamedPipeBinding<netNamedPipeBinding>一个安全、可靠且经过优化的绑定,适用于 WCF 应用程序之间计算机上的通信。IPCBinary
    NetMsmqBinding<netMsmqBinding>一个排队绑定,适用于 WCF 应用程序之间跨计算机的通信。MSMQBinary
    NetPeerTcpBinding<netPeerTcpBinding>一个支持多计算机安全通信的绑定。P2PBinary
    MsmqIntegrationBinding<msmqIntegrationBinding>一个绑定,适用于 WCF 应用程序和现有消息队列(也称为 MSMQ)应用程序之间跨计算机的通信。MSMQBinary

    显然绑定与地址是对应的:比如NetTcpBinding绑定只能使用TCP地址。而上表中所有WS开始的绑定都支持TEXT的SOAP消息编码,这表明选择这些绑定的服务,可以由其他技术和平台使用,如Java等。而其他采用二进制SOAP编码的绑定则只支持WCF到WCF的交互。

  • 契约(Contract):契约是对服务操作的抽象,也是对消息交换模式以及消息结构的定义。
  • 一般通过配置的方式进行。上面添加终结点和定义服务行为的代码可以用下面的配置。
  • <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <services>
                <service name="XfServer.FirstService" behaviorConfiguration="behaviorConfiguration">
                    <host>
                        <baseAddresses>
                            <add baseAddress="http://localhost:8000/"/>
                        </baseAddresses>
                    </host>
                    <endpoint address="" binding="basicHttpBinding" contract="XfServer.IFirstService"></endpoint>
                </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="behaviorConfiguration">
                        <serviceMetadata httpGetEnabled="true"/>
                    </behavior>
                </serviceBehaviors>
            </behaviors>
        </system.serviceModel>
    </configuration>
  • 对于初学者来说,WCF的配置显得过于复杂,直接对配置文件进行手工编辑不太现实。在这种情况下,可以直接使用VS提供的配置工具。你可以通过VS的工具(Tools)菜单,选择“WCF Service Configuration Editor”子项,开启这样的一个配置编辑器。
  • Client一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。客户端通过另一个控制台应用模拟(进程为Client.exe);服务被成功寄宿后,服务端便开始了服务调用请求的监听工作。此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据创建客户端程序进行服务的消费。借助这些元数据通过代码生成工具(SvcUtil.exe)自动生成用于服务调用的服务代理相关的代码和相应的配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值