[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,这 ...
随机推荐
- Redis系列(六)-SortedSets设计技巧
阅读目录: 介绍 Score占位 更多位信息 总结 介绍 Redis Sorted Sets是类似Redis Sets数据结构,不允许重复项的String集合.不同的是Sorted Sets中的每个成 ...
- Redis系列(五)-Opserver的监控
阅读目录: 基本介绍 使用配置 部署实例 面板属性 基本介绍 Opserver是Stack Exchange的一个开源监控系统,基于Net.MVC开发,所以Net程序员可以轻松基于它二次开发.它主要监 ...
- 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...
- 让Ajax更简单
之前写了一篇 ASP.NET中一种超简单的Ajax解决方案 最近把他拿出来更新了下,把demo也搞的更详细了一点 加入了blqw.Json,所以支持更多类型参数和返回值 优化了对exception的处 ...
- 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...
- Atitit 动态调用webservice与客户端代理方式调用
Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke 直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...
- Uiautomator 2.0之UiObject2类学习小记
1. 基础动作 1.1. 相关API介绍 API 说明 clear() 清楚编辑框内的内容 click() 点击一个对象 clickAndWait(EventCondition<R> co ...
- Script component 用法
在SSIS中,可以使用C#编写脚本,这是十分激动人心的事,能够使用C#代码,使得Script Component无所不能. 第一部分:组件简介Script Component 有三种类型:Source ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
- OpenCASCADE Root-Finding Algorithm
OpenCASCADE Root-Finding Algorithm eryar@163.com Abstract. A root-finding algorithm is a numerical m ...