操作分界

在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提供的一些对于特殊需求的优化技术,通常情况下不必去可以使用它。

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

  1. C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序

    C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...

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

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

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

    一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的 ...

  4. C++类继承中的构造函数和析构函数 调用顺序

    思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...

  5. cocos2d-x 2.x版本中,场景切换各方法调用顺序

    假设从A场景切换到B场景,调用各场景方法的顺序为: 如果没有切换效果(transition),则先调用B的init(),再调用A的onExitTransitionStart(),接着调用A的onExi ...

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

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

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

    参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...

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

    UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...

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

    UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear ...

随机推荐

  1. Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)

    在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...

  2. 中文字体@font-face的导入

    由于英文字母只有26个,所以生成.eot..woff..ttf..svg等文件是比较小的,也就十几KB而已.但是对于汉字来说,常用的汉字就已经2500个了,生成的文件一般要2-3MB,如此庞大的包对页 ...

  3. Oracle 的PL/SQL语言使用

    --PL/SQL语言(procedure language 过程化语言) --1.声明类型 declare k number; m ; --Character String buffer too sm ...

  4. 升级MAC OS到10.13, 10.14系统后UNITY工程无法加载资源的解决办法

    升级MAC OS到10.13, 10.14系统后,出现UNITY工程无法加载资源的情况: Unity项目中Asset目录显示为空! 解决办法一: 打开Launchpad中的磁盘工具 (也就是实用工具下 ...

  5. http协议的总结

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统,其主要特点概括如下: 1.支持客户/服务器模式. 2.简单快速:客户向服务器请求服务时,只需传送请求方法和 ...

  6. P1379 八数码难题

    #include<iostream> #include<bits/stdc++.h> using namespace std; #include<vector> u ...

  7. 【TOJ 1072】编辑距离(动态规划)

    描述 假设字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符修改成另一个字符这三种操作. 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 下面我们定义两个字符串的编辑 ...

  8. Ajax中异步与同步的区别

    同步可以解决,只有前一个请求结束后,当前请求才会发起.

  9. iOS通过切片仿断点机制上传文件

    项目开发中,有时候我们需要将本地的文件上传到服务器,简单的几张图片还好,但是针对iPhone里面的视频文件进行上传,为了用户体验,我们有必要实现断点上传.其实也不是真的断点,这里我们只是模仿断点机制. ...

  10. crontab基础笔记 思维导图版

    直接上图吧----------------------------------------------------------------------------------------------- ...