【1】可靠性传输:

【1.0】网络协议基础知识:

这里我们有必要先介绍OSI参考模型几个主要协议的基本概念,见下表:

OSI中的层

功能

TCP/IP协议族

应用层

文件传输,电子邮件,文件服务,虚拟终端

TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet

表示层

数据格式化,代码转换,数据加密

没有协议

会话层

解除或建立与别的接点的联系

没有协议

传输层

提供端对端的接口

TCP,UDP

网络层

为数据包选择路由

IP,ICMP,RIP,OSPF,BGP,IGMP

数据链路层

传输有地址的帧以及错误检测功能

SLIP,CSLIP,PPP,ARP,RARP,MTU

物理层

以二进制数据形式在物理媒体上传输数据

ISO2110,IEEE802。IEEE802.2

TCP/IP是一个协议族,为了帮助大家理解下面协议绑定的内容,把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的汽车,汽车上货物就是HTTP,SNMP,FTP,SMTP,DNS,Telnet 协议等。

  TCP和UDP是FTP,HTTP和SMTP等应用层协议使用的传输层协议。TCP提供面向连接、有保证的数据传输,而UDP不提供。TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。

  HTTP(超文本传输协议)是利用TCP协议在两台机器(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

这里随便介绍一下SOAP协议,它也是基于XML语言,可以实现分布式系统间的数据交换的协议。 SOAP:Simple Object Access Protocol简单对象访问协议是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序,当然也 可以映射到TCP协议。

【1.1】WCF可靠性传输简介:

WCF与其他面向服务技术之间(asp.net /j2ee Web Service技术等)最大的区别在于传输可靠性(Transport Reliability)与消息可靠性(Message Reliability)。传输可靠性(例如通过TCP传输)在网络数据包层提供了点对点保证传递(Point-to-Point Guaranteed Delivery),以确保数据包的顺序无误。传输可靠性不会受到网络连接的中断或其他通信问题的影响。消息可靠性提供了端对端保证传递(End-to- End Guaranteed Delivery),确保消息的顺序无误。消息可靠性与引入的中间方的数量无关,与网络跳数(Network Hops)的数量也没有关联。消息可靠性基于一个行业标准。该行业标准为可靠的基于消息的通信维持了一个在传输层的会话。如果传输失败,例如无线连接中 断,消息可靠性就会重试(Retries)功能。它还能够自动处理网络阻塞(Congestion)、消息缓存(Message Buffering)以及流控制(Flow Control),根据具体情况适时调整发送的消息数。消息可靠性还能够通过对连接的验证管理连接自身,并在不需要连接时清除它们。

这里WCF的可靠性传输首先来说数据传输同样依赖底层的网络传输协议,如TCP协议,TCP传输控制协议底层就是要求建立连接的状态进行数据传递。其次消息可靠性也是对已有消息可靠性行业标准的支持,WCF框架实现或者扩展了消息可靠性行业标准。

Web Service使用http/post/get/soap三种方式进行访问,http协议是请求/响应协议,不会维持特定的传输通道,本身是不支持可靠性。

【1.2】传输协议与可靠性:

看来以上的介绍内容,我们再来介绍WCF绑定协议的可靠性,同样WCF的可靠性和具体的绑定协议弥补可分。总结了绑定、可靠性、有序传递(Ordered Delivery)以及它们各自的默认值之间的关系。可靠性与绑定对应关系如下:

可靠性与绑定对应关系

绑定协议名称            支持可靠性         默认可靠性           支持有序传递       默认有序传递

BasicHttpBinding                No               N/A                    No                  N/A

NetTcpBinding                   Yes               Off                    Yes                  On

NetPeerTcpBinding              No                N/A                   No                  N/A

NetNamedPipeBinding          No                N/A (On)           Yes                  N/A (On)

WSHttpBinding                  Yes               Off                    Yes                  On

WSFederationHttpBinding   Yes               Off                     Yes                  On

WSDualHttpBinding            Yes               On                     Yes                  On

NetMsmqBinding                 No                N/A                    No                   N/A

MsmqIntegrationBinding       No               N/A                    No                   N/A

BasicHttpBinding不支持可靠性,BasicHttpBinding面向旧的ASMX Web服务,是不具有可靠性的;

NetMsmqBinding不支持可靠性,MSMQ协议,使用消息队列,针对断开调用,不存在传输会话;

MsmqIntegrationBinding不支持可靠性;支持WCF与MSMQ协议通信,不存在传输会话;

NetPeerTcpBinding不支持可靠性。NetPeerTcpBinding则为广播场景设计。

WSDualHttpBinding支持可靠性的,建立两个http会话通道,保持回调通道,确保基于HTTP协议的客户端存在;

NetTcpBinding 支持可靠性,显然使用TCP传输数据。以及各种WS绑定,默认情况下并不支持可靠性,允许启用;

NetNamedPipeBinding绑定总是拥有一个确定的从客户端到服务的跳数,因而它的可靠性是绑定固有的;

WSFederationHttpBinding支持可靠性,支持联邦通信协议,支持在多个安全区域进行安全会话。

WS绑定协议一般都提供了对可靠性传递的支持,可以编程或者配置方式在项目里启用。可靠性传输要根据绑定的目标场景而定。

【1.3】有序消息:

TCP提供了差错和流量控制。WCF消息可靠性也以来具体的绑定协议底层的传输协议和自身扩展的机制确保了消息的有序传递,允许消息按照发送顺序而非接收顺序执行。我们在实际的WCF项目里及可以只启用可靠性,而不启用有序传递。

同样WCF也为我们提供了灵活的方式来配置也启用项目中的传输可靠性和传递的有序性,你可以使用配置文件方式也可以使用编程方式实现。如果我们启用了可靠 性,则客户端与服务端必须保持配置一致,否则客户端无法与服务通信。我们可以只对支持它的绑定配置可靠性。下面我们就来进行详细的介绍。

【2】配置方式实现可靠性传输:

下面我们使用服务端配置文件,启用了TCP绑定的可靠性。代码如下:

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="WCFService.WCFServiceBehavior"
        name="WCFService.WCFService">
        <endpoint
          address="http://localhost:8001/WCFService"
          binding="wsHttpBinding"
          contract="WCFService.IWCFService">
        </endpoint>
        <endpoint
          address="net.tcp://localhost:8002/WCFService"
          binding="netTcpBinding"
           bindingConfiguration="ReliableTCP"
          contract="WCFService.IWCFService">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8001/"/>
            <add baseAddress="net.tcp://localhost:8002/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WCFService.WCFServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netTcpBinding >
        <binding name="ReliableTCP">
          <reliableSession enabled="True"/>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>

这里我们要设置服务终结点的绑定配置,bindingConfiguration="ReliableTCP",然后在给出具体绑定配置的可靠传输

      <netTcpBinding >
        <binding name="ReliableTCP">
          <reliableSession enabled="True"/>
        </binding>
      </netTcpBinding>

这样WCF服务就会启用可靠消息传递。

【3】编程方式实现可靠性传输:

至于编程配置方式,这里我们稍作介绍,TCP绑定和WS绑定提供了略微不同的属性来配置可靠性。这里的例子我们继续使用的是针对TCP编程实现可靠性传输的示例代码:

//采用自托管方式,也可以是IIS、WAS,Windows服务等用户自定义程序托管服务
    public class WCFHost
    {
        static void Main(string[] args)
        {

//反射方式创建服务实例,
            //Using方式生命实例,可以在对象生命周期结束时候,释放非托管资源
            using (ServiceHost host = new ServiceHost(typeof(WCFService.WCFService)))
            {
                //相同的服务注册多个基地址
                //添加服务和URI,用户资源标识符
                Uri tcpAddress = new Uri("net.tcp://localhost:8001/WCFService");
                //Uri httpAddress = new Uri("http://localhost:8002/WCFService");
                //Uri pipeAddress = new Uri("net.pipe://localhost:8002/WCFService");
                SecurityMode securityMode = new SecurityMode();//实例化安全模型
                //设置可靠性会话为真
                NetTcpBinding netTcpBinding = new NetTcpBinding(securityMode, true);
                //添加服务终结点,方式不变
                host.AddServiceEndpoint(typeof(WCFService.IWCFService), netTcpBinding, tcpAddress);
                //host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), httpAddress);
                //host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetNamedPipeBinding(), pipeAddress);
                ////判断是否以及打开连接,如果尚未打开,就打开侦听端口
                if (host.State != CommunicationState.Opening)
                    host.Open();
                //显示运行状态
                Console.WriteLine("Host is runing! and state is {0}", host.State);
                //等待输入即停止服务
                Console.Read();

}
        }

SecurityMode securityMode = new SecurityMode();这个语句就是实例化安全模型,NetTcpBinding netTcpBinding = new NetTcpBinding(securityMode, true);传入的参数为true,就是启用可靠性传递。添加服务终结点,方式不变host.AddServiceEndpoint(typeof(WCFService.IWCFService), netTcpBinding, tcpAddress);这样就编程实现了TCP消息的可靠性传递。

【4】编程实现必备有序传递:

我们这里在简单介绍一下WCF有序传递的概念。我们知道服务代码和契约定义应该与它使用的绑 定及属性无关。实际上,WCF服务的实现或者数据契约本身都会依赖于系统消息的有序传递(Ordered Delivery)。为了帮助契约或服务的开发者能够约束支持的绑定,WCF定义了DeliveryRequirementsAttribute类,这是 一个密封类,不可继承,我们使用他来定义服务的传递属性。这里应用到服务属性,设置服务启用有序队列传递。

    [DeliveryRequirementsAttribute(
  QueuedDeliveryRequirements = QueuedDeliveryRequirementsMode.Allowed,
  RequireOrderedDelivery = true
)]
    public class WCFService : IWCFService
    {
        //实现接口定义的方法
        public string SayHello(string name)
        {
            Console.WriteLine("Hello! {0},Using string ", name);
            return "Hello! " + name;
        }
        //实现接口定义的方法
        public string SayHelloToUser(User user)
        {
            Console.WriteLine("Hello! {0}    {1},Using DataContract ", user.FirstName, user.LastName);
            return "Hello! " + user.FirstName + " " + user.LastName;
        }
    }

DeliveryRequirementsAttribute..::.RequireOrderedDelivery 属性设置绑定协议是否必须支持已排序消息。可以应用到服务一级,对WCF服务的所有终结点施加影响,或者只对公开了特定服务契约的终结点施加影响;如果应 用到WCF服务一级,则意味着选用有序传递是根据具体实现作出的决策。DeliveryRequirements特性也可以应用到服务契约一级,它会对所 有支持该契约的服务施加影响。体现了对有序传递的要求是根据设计作出的决策。这一约束会在装载服务时得到执行与验证。命名管道绑定符合有序传递的约束。 注:

命名空间:  System.ServiceModel
程序集:  System.ServiceModel(在 System.ServiceModel.dll 中)

【5】结果分析和总结。

配置完毕后,我们可以在客户端添加WCF服务引用,生成的配置文件,内容包含对可靠消息传递的配置信息,具体如下:

            <netTcpBinding>
                <binding name="NetTcpBinding_IWCFService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="true" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>

<reliableSession ordered="true" inactivityTimeout="00:10:00"  enabled="true" />是对可靠消息传递的的设置节点信息。

以上就是本节的全部内容,介绍了基本的网络协议,WCF可靠性传递的概念以及和具体的各个绑定协议之间的关系,我们还给出了一个简单的通过配 置文件和代码实现可靠消息传递的例子。并进行了分析讲解。WCF为我们提供了可靠消息传递的有效机制,这个特性也是基于已有网络传输协议,WCF再次基础 上多数据通信模型进行了扩展。这种特性确实对增强我们程序的数据传递的准确性有很大的帮助,但是是否使用可靠消息传递要基于实际的项目需要,不能强制使 用。我们获得安全可靠性的同时,实际底层付出的是效率的代码。

http://blog.csdn.net/book_frank_xl/article/details/4735921

WCF服务可靠性传输配置与编程开发(转)相关推荐

  1. WCF服务端基于配置的实现——拦截

    如果说到拦截器,相信大家都不陌生,所有的AOP都依赖各种形式的拦截器.为了让WCF服务端的行为发生变化,这里要借助拦截器的力量. 问题:WCF里面如何创建一个拦截器? 事实上,WCF里面有很多种拦截器 ...

  2. 部署承载于 Internet 信息服务中的 WCF 服务

    部署承载于 Internet 信息服务中的 WCF 服务 开发和部署承载于 Internet 信息服务 (IIS) 中的 Windows Communication Foundation (WCF) ...

  3. 寄宿于CS程序的WCF服务

    最近项目中,需要对外部程序提供服务接口,用来进行数据交互和部分设备控制.由于都是使用的.NET平台开发的,因此想到使用WCF服务.之前也用过WCF服务,但是当初使用的时候是通过IIS寄宿的,有些地方不 ...

  4. WCF服务实例激活类型编程与开发(转)

    [引言]: 在WCF分布式开发必备知识(2):.Net Remoting这 篇文章里我已经介绍过了Net Remoting相关的概念,其中也包括Net Remoting的激活方式:SingleTon模 ...

  5. 多版本Visual Studio 集成环境下的WCF 开发-服务库默认配置表

    多版本Visual Studio 集成环境下的WCF 开发-服务库默认配置表 Visual Studio2008 Visual Studio2008只有服务库,而没有服务应用程序,其服务库生成配置文件 ...

  6. WCF服务编程 学习笔记(2)

    (承接上文,只是不好意思,在文中用到的图片自己没有插入.) 12.终结点 服务与地址.绑定以及契约有关.其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约则定义了服务的内容.为便于记忆,我们可 ...

  7. WCF服务编程 学习笔记(1)

    你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...

  8. WCF服务编程设计规范(6):队列服务、安全和服务总线

    WCF服务编程设计规范(6):队列服务.安全和服务总线.本节整理队列服务(Queue Servuce).服务安全(Service Security)和服务总线(Service Bus)的设计规范. Q ...

  9. WCF服务编程(4):《WCF服务编程》第3版中文版翻译结束,即将出版

    原文地址: <WCF服务编程>第4版本翻译完毕!2016年底应该出版 [置顶]↑ WCF服务编程(4):<WCF服务编程>第3版中文版翻译结束,即将出版 ↑ 作为世界范围内最经 ...

  10. WCF服务开发与调用的完整示例

    第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IService1.cs和Service1.cs两个类文件.我们可以直接对其修改开发我们的服务,但一般直接删除. ...

最新文章

  1. fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用
  2. Python 批量处理 Excel 数据后,导入 SQL Server
  3. 什么叫做多媒体计算机技术,多媒体计算机系统是什么
  4. Spring Boot devtool的使用
  5. 陕西科技大学18计算机调剂,2018年陕西科技大学考研调剂信息公布
  6. Linux目录/bin、/sbin、/usr/bin、/usr/sbin的区别
  7. 拔掉数据库的电源会怎样?阿里云数据库新型灾备架构,让云端容灾有“备”无患
  8. HDFS剩余空间大小的Java接口,java api获取hdfs索引大小
  9. 11月25日发!余承东官宣华为Mate新成员:最强悍高端平板?
  10. 单向链表相关——链表中环的问题
  11. redis string底层数据结构
  12. MagicDraw-IBD图
  13. atx20pin电源短接_ATX电源20针及24针接口定义
  14. platform创建说明
  15. python—成绩管理系统考试题目:小学五年级学生小明、小王、小丽、小花的语文、英语、数学成绩如……
  16. 安卓 chrome html文件,打开Chrome浏览器在本地文件的Android
  17. 村上春树的《海边的卡夫卡》与中日现实
  18. c语言整数四则运算表达式的输出格式控制,四则运算
  19. 数据仓库Hive编程——HiveQL的数据定义(一):Hive中的数据库
  20. latex画三线表模板

热门文章

  1. iOS 百度地图SDK接入与使用指南(以导航SDK为例):下载SDK、运行报错修改、代码编辑等
  2. [Oracle] SQL*Loader 详细使用教程(5)- 典型例子
  3. TypeScript - 字符串字面量类型
  4. MySQL实现SQL Server排名函数
  5. Shell自动备份部署新项目
  6. c#:浅克隆和深克隆,序列化和反序列化
  7. 关于URL大小写问题
  8. jQuery调用WebService详解
  9. 忽然发现自己少了很多爱好。。。。。。。。。
  10. [引]VS2005 主题(Theme)和外观(skin)帮助文档:主题和外观概述