[WCF编程]10.操作:单向操作
一、单向操作概述
WCF提供了单向操作,一旦客户端调用,WCF会生成一个请求,但没有相关的应答信息返回给客户端。所以,单向操作是不能有返回值,服务抛出的任何异常都不会传递给客户端。
理想情况下,一旦客户端调用了一个单向操作,它只会在要求调用的一瞬间被阻塞。事实上,单向调用不等于异步调用。当单向调用到达服务端时,不会立即分发这些调用,而是将调用方法服务端的队列中,并在某个时间分发。这一过程要根据服务配置的并发模式行为而定。服务要放入到队列中的消息个数与哦诶只的管道及可靠性模式有关。如果队列消息的数量超过了队列的容量,即使发出的只是单向调用,也会阻塞客户端。然而,一旦调用被放入队列中,就会取消对客户端的阻塞,继续执行。同时,服务会在后台处理这一操作。
开发人员容易错误的认为单向操作等于并发调用。如果客户端使用了相同的代理,但却利用了多线程调用单向操作,则在服务端的调用可能是并发,也可能不是。从本质上将,这种交互式是由服务并发管理模式和传输会话所决定的。
所有的WCF绑定都支持单向操作。
二、配置单向操作
OperationContract特性定义了Boolean类型的IsOneWay属性:
public sealed class OperationContractAttribute : Attribute
{
public bool IsOneWay { get; set; }
}IsOneWay属性的默认值为false,即默认操作为请求/应答操作,如果将IsOneWay属性设置为true,方法就会成为单向操作。
[ServiceContract]
public interface IService7
{
[OperationContract(IsOneWay=true)]
void MyMethod();
}调用单向操作时,客户端并无任何特别之初。IsOneWay属性的值会包含在服务元数据中。注意,服务契约定义与客户端导入定义中的IsOneWay的值是相同的。
由于单向操作没有应答消息,因此它不能包含返回值。如下所示:
[ServiceContract]
public interface IService7
{
[OperationContract(IsOneWay=true)]
void MyMethod();
}事实上,在加载宿主或打开代理时,WCF会强制要求验证方法的签名。
三、单向操作和可靠性
客户端不关心调用的结果,并不意味着它不关心调用是否发生。总而言之,即使采用了单向操作,也必须保证服务的可靠性,使他能够确保请求正确的传递到服务。
但客户端不会考虑单向操作的调用顺序,这也是WCF允许开发者将有效的可靠性传递从有效的有序传递与消息的执行中分离出来的主要原因。
四、单向操作与会话服务
WCF允许开发者设计一个具有单向操作的会话契约:
[ServiceContract(SessionMode=SessionMode.Required)]
public interface IService7
{
[OperationContract(IsOneWay=true)]
void MyMethod();
}在这种配置下,如果客户端发出一个单向操作,则在执行方法时会关闭代理,然后阻塞客户端直到操作完成。
虽然技术上可行,但是在一个会话契约中包含一个单向操作是一种糟糕的设计。因为拥有一个会话往往意味着服务需要管理代表了客户端的状态。任何异常都可能破坏这个状态,而这时的客户端取无法获取异常。此外,客户端或服务之所以选择一个会话交互,是因为它使用的契约需要通过某个状态机 完成锁步执行。单调操作无法满足这种模式的要求。所以建议只能将单向操作应用到单向服务或者单例服务中。
如果在会话契约中定义了单向操作,就必须保证单向操作是终止会话的最后一个操作。这个可以通过分布操作来实现:
[ServiceContract(SessionMode=SessionMode.Required)]
public interface IService7
{
[OperationContract()]
void MyMethod();
[OperationContract(IsOneWay = true,IsInitiating=false,IsTerminating=true)]
void Over();
}
五、单向操作与异常
即使单向操作没有返回值,也不会从服务端返回异常,但客户端仍然需要获得单向调用的异常,设置推断调用在服务段已经失败。
如果没有传输会话(使用BasicHttpBingding绑定或不包含可靠消息传输与安全的WsHttpBingding绑定),在调用一个单向操作期间,如果发生异常,客户端并不会受到影响,会继续发出对相同代理实例的调用:
[ServiceContract]
public interface IService7
{
[OperationContract(IsOneWay =true)]
void MethodWithError();
[OperationContract]
void MethodWithoutError();
} [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Single)]
public class Service7:IService7
{
public void MethodWithError()
{
throw new Exception();
}
public void MethodWithoutError()
{ }
}
//不具有传输会话
MyContractClient proxy = new MyContractClient();
proxy.MethodWithError();
proxy.MethodWithoutError();
proxy.Close();如果存在传输会话,那么一个服务端的异常(包含单向操作抛出的异常)就会操作通道错误。此时,客户端不能发出任何一个使用相同代理实例的新的调用。
[ServiceContract]
public interface IService7
{
[OperationContract(IsOneWay =true)]
void MethodWithError();
[OperationContract]
void MethodWithoutError();
} [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Single)]
public class Service7:IService7
{
public void MethodWithError()
{
throw new Exception();
}
public void MethodWithoutError()
{ }
}
//具有传输会话
MyContractClient proxy = new MyContractClient();
proxy.MethodWithError();
try
{
proxy.MethodWithoutError();//因为通道错误,从而会被抛出
proxy.Close();
}
catch
{}客户端甚至不能安全地关闭代理。因此,单向操作并不具备即发即弃的特性,因为客户端在调用期间会发现服务端出现的错误。
以后会展示如何真正的异步即发即弃的操作使用单向操作。
[WCF编程]10.操作:单向操作的更多相关文章
- [WCF编程]10.操作:回调操作
一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...
- [WCF编程]10.操作:事件
一.事件概述 基础的WCF回调机制并不能阐明客户端与服务之间交互的本质.双向回调的规范使用可以通过事件来完成.客户端发生的相关事项都可以通过事件通知客户端或者多个客户端.事件可能源于直接的客户端调用, ...
- [WCF编程]10.操作:请求/应答操作
一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...
- [WCF编程]10.操作:流操作
一.流操作概述 在默认情况下,当客户端调用服务时,服务只有在接收到完整的消息后才会被调用,同样,客户端只有在包含了调用结果的返回消息被完整接受时,才会解除对它的阻塞. 对于数据量小的消息,这种交换模式 ...
- .Net-WCF-图书:《WCF编程》
ylbtech-.Net-WCF-图书:<WCF编程> <WCF编程>是2008年1月机械工业出版社出版的图书,作者是Juval Lowy.Clemens Vasters. 1 ...
- WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).
WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...
- 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件
[源码下载] 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 创建文件夹,重命名文件夹,删除文件夹, ...
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- Ubuntu 15.10 下Scala 操作Redis Cluster
1 前言 Redis Standalone,Redis Cluster的安装在前面介绍过,地址:http://www.cnblogs.com/liuchangchun/p/5063477.html,这 ...
随机推荐
- Hadoop学习笔记—19.Flume框架学习
START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. ...
- 在VMWare中建立Hadoop虚拟集群的详细步骤(使用CentOS)
最近在学习Hadoop,于是想使用VMWare建立一个虚拟的集群环境.网上有很多参考资料,但参照其步骤进行设置时却还是遇到了不少问题,所以在这里详细写一下我的配置过程,以及其中遇到的问题及相应的解决方 ...
- Tomcat7基于Redis的Session共享实战一
本文主要介绍如何使用redis对tomcat7的session进行托管. 1.安装Redisredis安装比较简单,此处略过. 2.配置两个Tomcat在本机上配置两个Tomcat,分别为tomcat ...
- Atitit 数据库的事件机制--触发器与定时任务attilax总结
Atitit 数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...
- 基于JQuery的浮动DIV显示提示信息并自动隐藏
/** * 浮动DIV定时显示提示信息,如操作成功, 失败等 * @param string tips (提示的内容) * @param int height 显示的信息距离浏览器顶部的高度 * @p ...
- oc集合
本人之前学习过一年半ios开发 由于行情太过凄惨,故转前端.心在前端,苹果亦难忘!把我平时的笔记作出给大家总结! 回顾之前的知识 便利初始化函数:框架类库中的一些类有一系列的以init开头的方法,这些 ...
- Lookup component 用法
Lookup component 类似于Tsql的join子句, select a.* ,b.* from dbo.tis a left join dbo. tdes b on a.code=b.co ...
- Derived Column 用法
Derived Column Component 用法是为数据流增加派生列,Derived column 有两种用法:add as new column 或 replace . 图中,增加一个 De ...
- VS无法设置断点的解决方案
第一种情况的处理 第二种情况的处理
- 深入浏览器兼容 细数jQuery Hooks 属性篇
关于钩子:http://www.cnblogs.com/aaronjs/p/3387906.html 本章的目的很简单,通过钩子函数更细节的了解浏览器差异与处理方案, 版本是2.0.3所以不兼容ie6 ...