一、单向操作概述

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.操作:单向操作的更多相关文章

  1. [WCF编程]10.操作:回调操作

    一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...

  2. [WCF编程]10.操作:事件

    一.事件概述 基础的WCF回调机制并不能阐明客户端与服务之间交互的本质.双向回调的规范使用可以通过事件来完成.客户端发生的相关事项都可以通过事件通知客户端或者多个客户端.事件可能源于直接的客户端调用, ...

  3. [WCF编程]10.操作:请求/应答操作

    一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...

  4. [WCF编程]10.操作:流操作

    一.流操作概述 在默认情况下,当客户端调用服务时,服务只有在接收到完整的消息后才会被调用,同样,客户端只有在包含了调用结果的返回消息被完整接受时,才会解除对它的阻塞. 对于数据量小的消息,这种交换模式 ...

  5. .Net-WCF-图书:《WCF编程》

    ylbtech-.Net-WCF-图书:<WCF编程> <WCF编程>是2008年1月机械工业出版社出版的图书,作者是Juval Lowy.Clemens Vasters. 1 ...

  6. WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).

    WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...

  7. 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件

    [源码下载] 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 创建文件夹,重命名文件夹,删除文件夹, ...

  8. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  9. Ubuntu 15.10 下Scala 操作Redis Cluster

    1 前言 Redis Standalone,Redis Cluster的安装在前面介绍过,地址:http://www.cnblogs.com/liuchangchun/p/5063477.html,这 ...

随机推荐

  1. 使用EF取数据库返回的数据

    目录 一.取oracle自定义函数返回的自定义类型. 一.取oracle自定义函数返回的自定义类型. 1.首先创建一个函数返回自定义类型集合 --1.建立自定义类型 CREATE OR REPLACE ...

  2. ABP理论学习之审计日志

    返回总目录 本篇目录 介绍 配置 通过特性开启/关闭 注意 我项目中的例子 介绍 维基百科说: "审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序 ...

  3. Hadoop学习笔记—12.MapReduce中的常见算法

    一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...

  4. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  5. Microsoft Azure Web Sites应用与实践【1】—— 打造你的第一个Microsoft Azure Website

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  6. [ASP.NET MVC 小牛之路]02 - C#知识点提要

    本人博客已转移至:http://www.exblr.com/liam  本篇博文主要对asp.net mvc开发需要撑握的C#语言知识点进行简单回顾,尤其是C# 3.0才有的一些C#语言特性.对于正在 ...

  7. 优化MySchool数据库设计之【巅峰对决】

    优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...

  8. java:警告:[unchecked] 对作为普通类型 java.util.HashMap 的成员的put(K,V) 的调用未经检查

    java:警告:[unchecked] 对作为普通类型 java.util.HashMap 的成员的put(K,V) 的调用未经检查 一.问题:学习HashMap时候,我做了这样一个程序: impor ...

  9. Design7:数据删除设计

    在设计一个新系统的Table Schema的时候,不仅需要满足业务逻辑的复杂需求,而且需要考虑如何设计schema才能更快的更新和查询数据,减少维护成本. 模拟一个场景,有如下Table Schema ...

  10. jQuery2.0.3源码分析系列(28) 元素大小

    最近的分析都是有点不温不火,基本都是基础的回顾了 今年博客的目标目前总的来说有2大块 JS版的设计模式,会用jQuery来诠释 JS版的数据结构,最近也一直在狠狠的学习中. HTML息息相关的的样式 ...