WCF之消息模式
- 请求/响应:所有操作的默认行为,在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之消息模式的更多相关文章
- 【WCF全析(一)】--服务协定及消息模式
上周微软开发布会说.NET支持完全跨平台和并开放Core源码的新闻,让我们顿时感到.NET要迎来它的春天.虽然早在几年前.NET就能开发Android和IOS,但是这次的跨平台把Linux都放到了微软 ...
- 【架构之路之WCF全析(一)】--服务协定及消息模式
上周微软开公布会说.NET支持全然跨平台和并开放Core源代码的新闻,让我们顿时感到.NET要迎来它的春天.尽管早在几年前.NET就能开发Android和IOS,可是这次的跨平台把Linux都放到了微 ...
- wcf消息模式(随记)
----------------------------------------------消息模式:1.request\reply(默认)2.one-way(单工)[Isoneway=true]客户 ...
- wcf中的消息模式
1请求响应模式 a.wcf中的消息模式默认是请求响应模式 b.返回值是void默认也是请求响应模式,可返回服务端的错误信息 c.客户端在请求后,当前线程停止真到接受收服务器的响应 [Opereatio ...
- WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
原文:WCF技术剖析之二十一:WCF基本异常处理模式[中篇] 通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultExcept ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- 关于 ActiveMQ 的消息模式
1.JMS Queue 执行 load balancer语义:一条消息仅能被一个 consumer(消费者) 收到.如果在 message 发送的时候没有可用的consumer,那么它将被保存一直到能 ...
- WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- WCF技术剖析之二十一:WCF基本异常处理模式[下篇]
原文:WCF技术剖析之二十一:WCF基本异常处理模式[下篇] 从FaultContractAttribute的定义我们可以看出,该特性可以在同一个目标对象上面多次应用(AllowMultiple = ...
随机推荐
- 如何选择Javascript模板引擎(javascript template engine)?
译者 jjfat 日期:2012-9-17 来源: GBin1.com 随着前端开发的密集度越来越高,Ajax和JSON的使用越来越频繁,大家肯定免不了在前台开发中大量的使用标签,常见到的例子如下: ...
- 【JavaScript】XMLHttpRequest Level2使用指南
XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信. 最早,微软在IE 5引进了这个接口.因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生. ...
- android Unable to instantiate application
最近一段时间在做项目时候遇到一个错误老是解决不了,log如下: FATAL EXCEPTION: main12-11 09:08:53.922 E/AndroidRuntime( 1227): jav ...
- oc-31-多对象的内存管理
在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...
- 排序命令sort
Unix和Linux自带的sort命令功能非常强大,其主要功能是对文本内容按不同的方法排序.它不仅可以按一个或多个字段排序,还可以合并文件.使用sort处理一些较大的文件时,可能处理速度会比较慢,但却 ...
- Java再学习——sleep(), wait(), notify(), notifyAll()
首先一点就是Thread.sleep(long millis)方法是Thread类的静态方法,其他三个wait(), notify()和notifyAll()都是Object类的方法. sleep(l ...
- JSON使用——获取网页返回结果是Json的代码
public String getWebData(String strUrl){ String json = null; try { URL url = new URL(strUrl); HttpUR ...
- 使用sharepreferce记录数组数据
使用sharepreferce记录数组数据 /** * * sharepreference纪录news数据 * * */ private static final String name=" ...
- ios-为银行卡号格式化 每隔四位添加一个空格
-(NSString *)formatterBankCardNum:(NSString *)string { NSString *tempStr=string; NSInteger size =(te ...
- 【阿里云产品公测】OpenSearch初探
作者:阿里云用户 yqzzzz 这两天在折腾站内搜索,下午照例上阿里云网站看看ECS,OSS情况,恰巧看到免费公测的活动,咦,OpenSearch,看起来这不就是我要找的东西么! 1分钟时间填完申请 ...