• 请求/响应:所有操作的默认行为,在WSDL中表现为Input/Output元素.
  • One_Way.
    • 在WSDL中只有Input,没有回应(Output),所以没有异常报告。
    • 单向操作只会在发出调用的瞬间阻塞客户端,但是如果发出了多个单向调用,WCF会把这些调用放入队列,由于队列是有限容量的,过多数量的调用会被阻塞,直到有的请求出列,然后调用入列,才会解除客户端的阻塞。
    • 当要保证消息确实到达时,使用可靠性消息/MSMQ来暂时/长期保证。
    • 其无法维持客户端状态,所以应该是终止会话前的最后一个操作.
    • 如果服务器段信道发生问题,客户端只有在下次请求时才能发现。
    • 用途.
      • 不需要报告成功与否的操作(日志,事件发布);
      • 客户端通过另一个操作来获得前一次操作结果,即轮询.
      • 用于密集型操作,每次请求得到一定的结果;
      • 双向通信,用于非密集型,只有一个最终结果,服务端完成后主动通知客户端,解放客户端。(方法的表现形式为返回类型为void,参数不能有ref,out).
  • 双向.
    • 操作可以是请求/响应或者One_way。
    • 在WSDL中只有回调契约上有Output。
    • CallBack的实现代码在客户端,由服务器端调用CallBack,且该调用的方法必须为One_way或者可重入的.
    • 客户端端点:Duplex协议,提供好了BackChannel;而WSDualHttp要设置ClientBaseAdd带外调用:在服务器端,请求要被排队,然后按照先来先服务被处理,而带外处理,就是另建一个优先级较高的队列,让后来的请求有可能被先掉用.
  • 回调
    • BasicHttpBinding或WSHttpBinding绑定并不支持回调.
    • 如果使用了回调,则客户端生成的代理类必须继承自DuplexClientBase<T>代理类.
    • 服务对回调的调用可能死锁,解决办法: 1)将服务配置为可以多线程访问,但会增加开发的负担;2)在客户端的回调实现类的ConcurrencyMode =
      ConcurrencyMode.Reentrant.3)将回调设置为单向.
    • 在使用回调对象时,需要考虑到客户端代理可能关闭,此时的调用,得到一个ObjectDisposedException. 因此,对于客户端而言,当它不再需要接收回调或者客户端应用程序已经关闭时,最好能够通知服务.所以, 为服务契约增加两个操作Connect()与Disconnect().
    • 由于使用WSDualHttpBinding绑定执行回调时,需要开通两个HTTP通道,一个用于服务,一个用于回调。通常,WCF为回调通道选择了默认的80端口,但如果客户端运行了IIS,则可能会占用80端口,就会导致端口的冲突。实际上,我们可以为回调通道指定任何可用的端口,例如,我们可以通过配置文件为客户端指定基地址。然而,我们指定的端口仍然可能会被占用,只是这种占用的可能性比80端口小。为了避免潜在的端口冲突,同时简化程序员的工作,最好的办法是自动分配一个可用的端口.
  • 上下文重入(ConcurrencyMode)
    • 当对独占域拥有访问权限的线程A访问域外的方法(回调对象)时,有一个线程B要访问该独占域(服务对象),A会释放该域的锁以让B进入,直到B完成并释放锁后,A将重新进入该域.
    • 在客户端请求时,把自己的上下文在请求的同时发送给服务器端。服务器端处理完后,把这个上下文又发回给客户端。此上下文为C/S间共有.
    • 不可重入:客户端和服务器端互相等待上下文环境的释放。死锁(single).
    • 单线程可重入:对临界区资源很好的保护。(Reentrant).
    • 完全可重入:允许多线程对当前上下文进行处理。(Multiple).需要对临界资源进行处理。在GUI中,回调函数运行的线程必须为调用请求的线程.
  • 大消息.
    • 为了防止DOS,有一个消息的最大配额。
    • 1)MTOM:降低二进制传输的开销。方法:删除过多的无用信息,Base64编码:把2进制的8B一组改为6B一组,使数据量增大8/6倍。SOAP消息以MIME的文档多部分相关类型发送。使用时仅仅需要对配置文件进行修改。
    • 2)流传输:MTOM中整个消息被加载到内存里,开销比较大,使用流降低它,但是会损失某些特性(可靠性消息与安全性)。在客户端读取返回和服务端读取进入时要手动关闭流。而对于客户端发送和服务器返回时WCF默认自动关闭.
  • 分步操作
    • 当服务契约需要指定执行顺序时.
    • 使用操作契约的IsInitiating(默认=true)和IsTerminating(=false)属性实现.
    • IsInitiating=true的操作不一定是启动会话的第一个操作,相同设置的其它方法在被调用后,会启动一个会话,而该调用被加入该会话中.但是调用IsTerminating=true的操作必为关闭会话的操作,之后,不能调用服务的任何方法,除非再创建一个代理对象. IsTerminating=true的操作也可以为IsInitiating=true,启调用开始时开启会话,但是结束时会结束会话.

WCF之消息模式的更多相关文章

  1. 【WCF全析(一)】--服务协定及消息模式

    上周微软开发布会说.NET支持完全跨平台和并开放Core源码的新闻,让我们顿时感到.NET要迎来它的春天.虽然早在几年前.NET就能开发Android和IOS,但是这次的跨平台把Linux都放到了微软 ...

  2. 【架构之路之WCF全析(一)】--服务协定及消息模式

    上周微软开公布会说.NET支持全然跨平台和并开放Core源代码的新闻,让我们顿时感到.NET要迎来它的春天.尽管早在几年前.NET就能开发Android和IOS,可是这次的跨平台把Linux都放到了微 ...

  3. wcf消息模式(随记)

    ----------------------------------------------消息模式:1.request\reply(默认)2.one-way(单工)[Isoneway=true]客户 ...

  4. wcf中的消息模式

    1请求响应模式 a.wcf中的消息模式默认是请求响应模式 b.返回值是void默认也是请求响应模式,可返回服务端的错误信息 c.客户端在请求后,当前线程停止真到接受收服务器的响应 [Opereatio ...

  5. WCF技术剖析之二十一:WCF基本异常处理模式[中篇]

    原文:WCF技术剖析之二十一:WCF基本异常处理模式[中篇] 通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultExcept ...

  6. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  7. 关于 ActiveMQ 的消息模式

    1.JMS Queue 执行 load balancer语义:一条消息仅能被一个 consumer(消费者) 收到.如果在 message 发送的时候没有可用的consumer,那么它将被保存一直到能 ...

  8. WCF入门教程五[WCF的通信模式]

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  9. WCF技术剖析之二十一:WCF基本异常处理模式[下篇]

    原文:WCF技术剖析之二十一:WCF基本异常处理模式[下篇] 从FaultContractAttribute的定义我们可以看出,该特性可以在同一个目标对象上面多次应用(AllowMultiple = ...

随机推荐

  1. CircleWaveProgressBar

    https://github.com/eltld/CircleWaveProgressBar

  2. 好记心不如烂笔头之JQuery学习,第二章

    jQuery获取元素不需要担心元素不存在而报错,但是无论怎样 $("#xxx") 是一定会有返回值的,无论存不存在元素,那么依然是要对元素做判断的,判断的方法常见两种 1.看返回的 ...

  3. (文件描述符0、1、2),(stdin、stdout、stderr),(终端设备)这三者之间的关系???

    前言 在Linux系统中,一切设备都看作文件.而每打开一个文件,就有一个代表该打开文件的文件描述符.程序启动时默认打开三个I/O设备文件:标准输入文件stdin,标准输出文件stdout,标准错误输出 ...

  4. Golang学习 - regexp 包

    ------------------------------------------------------------ // 函数 // 判断在 b(s.r)中能否找到 pattern 所匹配的字符 ...

  5. Replace INTO与INSERT INTO的不同之处

    Replace INTO和INSERT INTO的区别: REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有 ...

  6. spring security源码分析之core包

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring I ...

  7. 神马小说:使用opensearch打造高性能搜索服务

    神马小说--- 使用opensearch打造高性能搜索服务 [使用背景] 神马小说是最早使用opensearch的用户,和opensearch一起成长.目前神马小说每天2亿搜索pv,1000w 用户. ...

  8. Parallel.ForEach() 并行循环

    现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...

  9. Android Activity的启动过程

    文章编辑的太长了,请移步我的csdn博客:http://blog.csdn.net/xyh269 Android Activity的启动过程原文链接:http://blog.csdn.net/xyh2 ...

  10. nodejs(一) 简单登录验证 使用mongoose 操作MongoDB

    ---恢复内容开始--- 开发使用webstorm 9  新建nodejs+express 项目 newfarmer 文章目录 配置Mongoose 创建目录及文件 插入数据,POST提交JSON增加 ...