WCF的三种消息交换模式
1.One-Way Calls
2.Request/Reply
3.Duplex
第一种是肉包子打狗,有去无回的类型。存在如下特征:
⑴没有返回值,返回值只能为void。
⑵不能包含ref或者out类型的参数。
⑶只有客户端发起请求,服务端并不会对请求进行回复。
第二种是有去有回类型,存在如下特征:
⑴调用服务方法后需要等待服务的消息返回,即便该方法返回void类型
⑵相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了。
⑶在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明。
第三种是有去有回还附加一趟类型
1.消息交换过程中,服务端和客户端角色会发生调换
2.服务端处理完请求后,返回客户端的不是reply,而是callback请求
对于第三种,请参考事件广播代码。
WCF的三种实例模式:PerSession,PerCall,Single
Single
PerCall就是一种吞吐能力很强的一种模式,当一个请求操作来到的时候,再创建服务对象,申请必要的资源,而当操作完成之后,立即销毁对象并释放资源,留给下一个请求。这就是提高了吞吐能力。而且WCF中默认的实例创建模式就是这种。
PerSesson就是那种能在服务端和客户端维护状态,当一个对象对象创建之后不会马上销毁,而是等待客户再次来消费它。缺点是站着茅坑不拉屎,优点是能够保持状态链接和维护状态,如果服务端操作不需要比较多的资源或者占用的资源也不宝贵,这种模式可用。
Single
一个一个来。
使用不同的实例模式,需要注意的又哪些?
1.对于PerCall模式,一定要记住,如果服务对象中的数据没有固化,并且不是静态变量,那它每次操作都会被重新初始化。
2.对于PerSession模式,第一要清楚有些Binding是不能用于的,具体有什么用,什么不能用,可以查阅http://www.cnblogs.com/jillzhang/archive/2008/02/03/1063406.html 。另外PerSession模式并不是代表状态会自动维护,那些被设置了IsTerminating=True的操作完成的时候,也会释放资源和销毁对象,即使不是True,那如果客户端长时间不与服务端联系,达到服务端最大忍耐限度,服务端也会变心。
3.对于Single模式,既然例外就它老哥一个,就简单多了,它能保持服务对象中的非静态全局变量。但是特别要注意的是,如果在这种模式下的话,要特别注意线程安全的问题。让10个人同时让一个理发师来服务
异常处理
WCF定义了几种异常处理模型,它们分别如下:
⑴缺省模式
⑵包含详细信息模式
⑶自定义异常消息模式
各种异常处理所适用的应用场合?
缺省模式:此种异常是返回比较模糊的异常,只告诉客户端我出错了,但不告诉具体细节。用于保护场服务程序。
包含详细信息模式:顾名思义。可以通过IncludeExceptionDetaillnFaults=True来设置返回具体的异常信息,这样就能告诉客户端出错了,并指出错误在哪里。这只使用于比较信任的客户端。返回详细异常有两种方法:第一种:通过在服务端的配置文件中设置文件;
第二种方式为通过在代码中指定:【ServiceBehavior(IncludeExceptionDetaillnFaults=true)】
⑶自定义异常消息模式
在WCF中,还支持更详细 异常消息,它通过自定义的异常消息FaultMessage来传达更多的内容,WCF采用通用的Soap Fault来处理异常,并提供了FaultException和FaultException两个类型来描述和操作异常。
WCF包括三种常见的类型的异常:
1.通讯异常,这通常是因为链路问题,比如服务没有启动,网络阻塞等,这类异常是CommunicationException或者起派生类
2.状态异常,这类异常通常是与上文提到的实例模式相关的,当访问了一个已经销毁的服务器对象时便会引发此类的异常,它们通常是ObjectDisposedException
3.服务异常,由服务端根据具体的业务逻辑触发,通常是FaultException值得注意的是当抛出服务异常的时候,不同的实例模式的处理方式不同。
PerSession这种模式,抛出异常,服务实例将销毁,客户端抛出FaultException,客户端代理对象无法继续使用。
---恢复内容结束---