WCF中操作的分界于调用顺序和会话的释放

操作分界

在WCF操作契约的设计中,有时会有一些调用顺序的业务,有的操作不能最先调用,有的操作必须最后调用,比如在从一个箱子里拿出一件东西的时候,必须先要执行打开箱子的操作,而关上箱子的操作应该在一切工作完成之后再被执行。

public interface Box{    void Open(int boxId);    int GetTotalFrenchletter();    void Close();}

为了解决这种实际需求,WCF在OperationContractAttribute中提供了IsInitiating和IsTerminating属性,IsInitiating的默认值为true,表示当前操作可以被第一个调用,IsTerminating属性默认为false,表示在这个方法执行完之后,服务对象不会被释放。可以通过这两个属性来控制上文中提供的需求。

此外,在修改了默认值之后,在装在服务的时候,WCF会去验证服务契约是否被定义为SessionMode.Required,如果不是,WCF会抛出InvalidOperationExample异常。

上文中的契约定义可以被重新设计:

[ServiceContract(SessionMode=SessionMode.Required)]public interface Box{    [OperationContract(IsInitiating=true,IsTerminating=false)]    void Open(int boxId);    [OperationContract(IsInitiating = false, IsTerminating = false)]    int GetTotalFrenchletter();    [OperationContract(IsInitiating = false, IsTerminating = true)]    void Close();}

Open方法上的Attribute和不去添加它是一样的含义,只不过看起来更加清晰一点

有一点需要注意的是,参照以上的契约定义,在Close调用执行完之后,WCF会异步的释放对象并且关闭会话,客户端将不能再通过当前代理调用服务中的操作。


实例停止

在服务的生命周期中,上下文是一直伴随着服务实例的创建于释放的整个过程的,然后处于某些目的,WCF也提供了分离两者的选项,允许服务实例被单独的停止。方法就是设置OperationBehaviorAttribute的ReleaseInstanceMode属性,它是一个名为ReleaseInstanceMode的枚举类型,包含了AfterCall、BeforeCall、BeforeAndAfterCall和None四个值,默认值为None。

BeforeCall:将在调用当前操作之前,WCF会释放当前的服务实例,然后创建一个新的实例取代它,然后在这个新的实例上调用方法;

AfterCall:将在调用当前操作之后释放当前服务实例;

BefireAndAfterCall:它是对前两种设置的一种补充,OperationBehavior如果应用了这个值,那么当前方法可以在标记了BeforeCall或者None的方法之后调用,也可以在在标记了AfterCall或者None的方法之后调用.

而在上文中的示例中,我们可以做如下的定义

public class Box : IBox{    public void Open(int boxId)    {        throw new NotImplementedException();    }

    public int GetTotalFrenchletter()    {        throw new NotImplementedException();    }

    [OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.AfterCall)]    public void Close()    {        lockBox();    }}

即使如此,WCF仍然提供了一个直接停止服务实例的方法,以满足在以上设置中都没有找到一个完美的适用于您的需求的解决方案。然后再非不得已的情况下,应该尽量不要使用它,因为它破坏了业务逻辑和服务本身生命周期的分离。

方法很简单,在OperationContext中存在InstanceContext,而这个属性包含一个ReleaseServiceInstance方法,在这个方法调用之后服务将会被释放:

[OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.AfterCall)]public void Close(){    lockBox();    OperationContext.Current.InstanceContext.ReleaseServiceInstance();}

然后,以上所述的技术,仅仅是WCF提供的一些对于特殊需求的优化技术,通常情况下不必去可以使用它。

时间: 2024-10-17 15:13:35

WCF中操作的分界于调用顺序和会话的释放的相关文章

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

继承中參数传递及调用顺序

一.简单派生类的构造函数传參 C++语言的继承特性,指子类能够继承父类的属性和行为,并能够又一次定义或加入新的属性和行为. 父类中为private型的属性和行为尽管被继承,可是子类中仍不能訪问.在继承机制下.构造函数是不能被继承的,所以基类构造函数的參数要由子类构造函数传. 单一继承的子类构造函数的声明(.h中)形式为: 派生类构造函数名(參数总表) (); 单一继承的子类构造函数的定义(.cpp中)形式为: 派生类名::派生类构造函数名(參数总表) : 基类构造函数名 (參数名表) { 派生类

C++中构造函数和析构函数的调用顺序

一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的定义 测试函数 构造函数和析构函数的调用顺序: 分析 全局作用域内定义的对象的构造函数,在文件内任何其他函数(包括main函数)开始执行之前调用,当main函数执行结束时,相应的析构函数被调用,如上面的Object 1. exit函数迫使程序立即结束,不执行自动对象的析构函数.当程序中检测到输入中有

真实代理(RealProxy)在WCF中的运用

在WCF中,当我们在调用服务端的方法时,一般有两点需要考虑:1.捕获服务端的异常信息,记录日志:2.及时关闭会话信道,当调用超时或调用失败时及时中断会话信道.我们一般会像下面这样处理(以CalculatorService为例): using (ChannelFactory<ICalculatorService> channelFactory = new ChannelFactory<ICalculatorService>("CalculatorService")

转:UIViewController中各方法调用顺序及功能详解

UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照调用顺序说明如下: 调试日志: 1 2 3 4 5 6 7 8 9 2013-07-14 12:15:49.048 VCTes

UIViewController中各方法调用顺序及功能详解

UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照调用顺序说明如下: 调试日志: 1 2 3 4 5 6 7 8 9 2013-07-14 12:15:49.048 VCTes

(转)UIViewController中各方法调用顺序及功能详解

目录(?)[-] 1 initWithNibNamebundle 2 loadView 3 viewDidLoad 4 viewWillAppear 5 viewDidAppear 6 viewWillLayoutSubviews 7 viewDidLayoutSubviews 8 viewWillDisappear 9 viewDidDisappear 10 viewWillUnload 11 viewDidUnload UIViewController中loadView, viewDidLo

重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载

参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体添加步骤为右键解决方案->添加->新建项目,在已安装模板中选择Windows 服务模板,具体如下图示所示: 第二步:添加Windows服务之后,修改对应的Service1.cs文件 using System; using System.Collections.Generic; using Syst

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }