• WCF编程系列(三)地址与绑定


    WCF编程系列(三)地址与绑定

     

    地址
        地址指定了接收消息的位置,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/

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

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

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

    示例二
    为示例一中服务添加一个TCP绑定及IPC绑定,并在客户端中使用新的绑定调用服务
    1.请将示例一的文件夹复制,将其名称修改为XfrogWCFStudy002
    2.打开Host项目的App.config文件,将其内容修改如下:

    隐藏行号 复制代码 ? App.config
    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <configuration>
    3.   <system.serviceModel>
    4.     <services>
    5.       <service behaviorConfiguration="behaviorConfiguration" name="Xfrog.Study.WCF.FirstService">
    6.         <host>
    7.           <baseAddresses>
    8.             <add baseAddress="http://localhost:8000/" />
    9.             <add baseAddress="net.tcp://localhost:8001/" />
    10.             <add baseAddress="net.pipe://localhost/"/> 
    11.           </baseAddresses>
    12.         </host>
    13.         <endpoint address="" binding="basicHttpBinding" contract="Xfrog.Study.WCF.IFirstService" />
    14.         <endpoint address="" binding="netTcpBinding" contract="Xfrog.Study.WCF.IFirstService" />
    15.         <endpoint address="" binding="netNamedPipeBinding" contract="Xfrog.Study.WCF.IFirstService" />
    16.       </service>
    17.     </services>
    18.     <behaviors>
    19.       <serviceBehaviors>
    20.         <behavior name="behaviorConfiguration">
    21.           <serviceMetadata httpGetEnabled="true"/>
    22.         </behavior>
    23.       </serviceBehaviors>
    24.     </behaviors>
    25.   </system.serviceModel>
    26. </configuration>

    我们在baseAddress节点内增加了两个基地址,并新定义了两个终结点endpoint。由于绑定是和特定的协议地址对应的,所以WCF能够 根据绑定类型找到相应的基地址,即在上述配置中netNamedPipeBinding绑定会自动找到对应的net.pipe://localhost /地址。
    3.在Client项目中打开App.config,将内容修改如下:

    隐藏行号 复制代码 ? App.config
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <configuration>
    3.     <system.serviceModel>
    4.         <bindings>
    5.             <basicHttpBinding>
    6.                 <binding name="BasicHttpBinding_IFirstService" closeTimeout="00:01:00"
    7.                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
    8.                     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    9.                     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
    10.                     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
    11.                     useDefaultWebProxy="true">
    12.                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    13.                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    14.                     <security mode="None">
    15.                         <transport clientCredentialType="None" proxyCredentialType="None"
    16.                             realm="" />
    17.                         <message clientCredentialType="UserName" algorithmSuite="Default" />
    18.                     </security>
    19.                 </binding>
    20.             </basicHttpBinding>
    21.           
    22.         </bindings>
    23.         <client>
    24.             <endpoint address="http://localhost:8000/" binding="basicHttpBinding"
    25.                 bindingConfiguration="BasicHttpBinding_IFirstService" contract="IFirstService"
    26.                 name="BasicHttpBinding_IFirstService" />
    27.           <endpoint address="net.tcp://localhost:8001/" binding="netTcpBinding" contract="IFirstService" name="FirstServiceNetTcpEndPoint"></endpoint>
    28.           <endpoint address="net.pipe://localhost/" binding="netNamedPipeBinding" contract="IFirstService" name="FirstServiceNetNamedPipeEndPoint"></endpoint>
    29.         </client>
    30.     </system.serviceModel>
    31. </configuration>

    我们在client节点内增加了两个终结点,分别指定了终结点的地址和绑定类型,并未终结点指定了一个名称(name)
    4.修改Client项目中的Program.cs代码如下:

    隐藏行号 复制代码 ? Program.cs
    1. using System;
      
    2. using System.Collections.Generic;
      
    3. using System.Text;
      
    4. 
      
    5. namespace Client
      
    6. {
      
    7.     class Program
      
    8.     {
      
    9.         static void Main(string[] args)
      
    10.         {
      
    11.             String key = "";
      
    12.             while (String.Compare(key, "Q", true)!=0)
      
    13.             {
      
    14. 
      
    15.                 FirstServiceClient client = new FirstServiceClient("BasicHttpBinding_IFirstService");
      
    16.                 Console.WriteLine("使用BASIC HTTP绑定:" + client.GetData(key));
      
    17.                     
      
    18.                 client = new FirstServiceClient("FirstServiceNetTcpEndPoint");
      
    19.                 Console.WriteLine("使用TCP绑定:" + client.GetData(key));
      
    20. 
      
    21.                 client = new FirstServiceClient("FirstServiceNetNamedPipeEndPoint");
      
    22.                 Console.WriteLine("使用IPC绑定:" + client.GetData(key));
      
    23. 
      
    24.                 key = Console.ReadLine();
      
    25.             }
      
    26.         }
      
    27.     }
      
    28. }
      
    29. 
      

    在原有代码上,我们新实例化了两个客户端代理类,注意在调用构造时我们传入了相应在配置文件中指定的终结点名称。通过该名称WCF将使用对应的终结点来与服务端交互。

    5.调试:在Host项目上单击右键,选择调试--启动新实例,待服务启动完成后,在Client项目上单据右键,选择调试--启动新实例。

    是不是很简单呢?我们几乎没有编写任何代码就为以前的服务新增了两个通讯协议。有兴趣的朋友可以为服务添加其他几个ws*绑定,不过呢,由于需要相 应特定的Windows服务或特殊服务行为的支持,NetMsmqBinding、NetPeerTcpBinding及 MsmqIntegrationBinding绑定现在还无法直接添加。

    源码下载

    Next,将介绍配置文件......

  • 相关阅读:
    C#中this的用法,你用过几种?【含源码示例】
    WP7开发—Silverlight多点触摸事件详解【含Demo代码】
    【原创】数据库辅助类库(Ling.Dber),大幅减少重复编写操作数据库代码
    自己开发的ASP.NET分页控件2.0 (Ling.Pager)
    .NET Standard 跨平台支持的实践
    企业应用架构研究系列二:MSF&Scrum 项目管理
    企业应用架构研究系列一:业务拆分
    golang sm3、sm4 加密
    SDUWHCCCC校内选拔赛题解
    Spring Boot + Spring Security + Vue实现前后端分离登录认证
  • 原文地址:https://www.cnblogs.com/dwuge/p/5318515.html
Copyright © 2020-2023  润新知