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. namespace Client
    
  5. {
    
  6.     class Program
    
  7.     {
    
  8.         static void Main(string[] args)
    
  9.         {
    
  10.             String key = "";
    
  11.             while (String.Compare(key, "Q", true)!=0)
    
  12.             {
    
  13.                 FirstServiceClient client = new FirstServiceClient("BasicHttpBinding_IFirstService");
    
  14.                 Console.WriteLine("使用BASIC HTTP绑定:" + client.GetData(key));
    
  15.                 client = new FirstServiceClient("FirstServiceNetTcpEndPoint");
    
  16.                 Console.WriteLine("使用TCP绑定:" + client.GetData(key));
    
  17.                 client = new FirstServiceClient("FirstServiceNetNamedPipeEndPoint");
    
  18.                 Console.WriteLine("使用IPC绑定:" + client.GetData(key));
    
  19.                 key = Console.ReadLine();
    
  20.             }
    
  21.         }
    
  22.     }
    
  23. }
    

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

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

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

源码下载

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

WCF编程系列(三)地址与绑定的更多相关文章

  1. WCF编程系列(四)配置文件

    WCF编程系列(四)配置文件   .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...

  2. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  3. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  4. WCF编程系列(一)初识WCF

    WCF编程系列(一)初识WCF   Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念:  地址:定义服务的 ...

  5. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

  6. WCF编程系列(二)了解WCF

    WCF编程系列(二)了解WCF   面向服务     服务是复用进化的结果,起初的复用是函数,面向对象编程的出现使复用从函数上升到对象,随后面向组件编程又将复用从对象上升到组件,现在面向服务编程将复用 ...

  7. WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】

    http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...

  8. [Python] 文科生零基础学编程系列三——数据运算符的基本类别

    上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...

  9. 022年9月12日 学习ASP.NET Core Blazor编程系列三——实体

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

随机推荐

  1. Android实例-自定义程序名称、图标、全屏和可旋转方向(XE8+小米2)

    1.自定义程序名称Project->Options->Version Info->label(改成需要显示的中文名即可) ,但是需要安装到安卓手机才可以显示. 2.全屏显示Proje ...

  2. ACCESS-delphi向中插入一条记录报错,但ACCESS不会

    问题:在DELPHI中向ACCESS中插入一条记录时,提示“插入错误”,但是取出SQL直接放在ACCESS中插入成功?答:原因是插入语句中的字段名是DELPHI的内部标示符.

  3. C语言/C++中怎样产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib. ...

  4. python os.path模块--转载

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  5. 使用jdbc连接上oracle的两种方法

    1. 使用thin连接 优点:thin驱动都是纯Java代码,并且使用TCP/IP技术通过java的Socket连接上Oracle数据库,所以thin驱动是与平台无关的,无需安装Oracle客户端,只 ...

  6. Android设计模式系列--模板方法模式

    模板方法,和单例模式是我认为GOF的23中最简单的两种模式.但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情况下并不被推荐使用,但是这种通过父类调用子类的方法,使用继承来改变算法的一部分 ...

  7. js replace如何实现全部替换

    js中replace默认只替换第一个相关字符,要想实现替换全部相关字符.如下: replace(/*/g, ','); 例如,替换字符串中的\n str.replace(/\n/g, ',');

  8. eclipse代码提示框背景色改动

    因为个人习惯,喜欢把eclipse的文本编辑框背景调成全黑色,可是代码提示框的默认背景色也是黑色.所以两者就冲突了.导致看不到代码提示框的内容. 后来发现代码提示框的背景色能够改动.改动内容例如以下: ...

  9. debian下图形化管理工具的安装

    MySQL GUI Tools是一套图形化桌面应用工具套装,可以用来管理MySQL服务器.该套装工具包含三个工具:MySQL QueryBrowser.MySQL Administrator和MySQ ...

  10. Gaussian Discriminant Analysis

    如果在我们的分类问题中,输入特征$x$是连续型随机变量,高斯判别模型(Gaussian Discriminant Analysis,GDA)就可以派上用场了. 以二分类问题为例进行说明,模型建立如下: ...