[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,这 ...
随机推荐
- 避免Castle Windsor引起的内存泄露
原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...
- 【读书笔记】Asp.Net MVC 上传图片到数据库(会的绕行)
之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存url了.而且这种方式支持ie6(ie6不支持jquery自动提交fo ...
- android内部培训视频_第一节
声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...
- OpenGL学习资料汇总
我学OpenGL的3D编程也有1.2个年头了,走了很多弯路,也算有点收获.现在整理出一些好用的资料如下. NeHe OpenGL教程中文版 地址(http://www.yakergong.net/ne ...
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型 按查找 ...
- jsp 分页, 判断是第一页,和最后一页.
<% //页的行数 int pagesize =20; //当前页 int currentPage = 1; try { currentPage = Integer.parseInt(reque ...
- SQL Server游标
什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...
- 解读sencha touch移动框架的核心架构(一)
sencha的前身就是Extjs了,sencha 框架是世界上第一个基于HTML5的Mobile App框架 那么何谓框架,传统软件工程对于库和框架的区分主要着眼于对应用运行流程的控制权,框架提供架构 ...
- UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解
{x:bind}是随着UWP被推出而被添加的,可以说是Win10 UWP开发专有扩展.虽然 {x:Bind} 缺少{Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Bind ...
- MySQL的分页优化
今天下午,帮同事重写了一个MySQL SQL语句,该SQL语句涉及两张表,其中一张表是字典表(需返回一个字段),另一张表是业务表(本身就有150个字段,需全部返回),当然,字段的个数是否合理在这里不予 ...