操作分界

在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. PHP-----TP框架----命名空间

    TP框架----命名空间 命名空间,起什么作用??? [1]命名空间是一个虚拟的目录,这个文件有可能存在这个电脑里的任何一个地方,但是如果要把这个文件它的命名空间全部写成同一个那么这些文件就相当于在同 ...

  2. 6、Web Service-拦截器

    1.为什么CXF设置拦截器 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器.拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入拦 ...

  3. 简单属性margin和padding

    关于margin属性的介绍 margin:20px 上 右 下 左 都是20px margin:20px 40 px 上 下 20px 左 右 40px margin:20px 40px  60px ...

  4. PAT——1021. 个位数统计

    给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字 ...

  5. COSTA Cross-layer Optimization for Sketch-based笔记与感受

    Main Idea 网络测量在sdn中十分重要,使用sketch的方法需要消耗大量硬件资源,占用其他重要功能的资源,无法容纳更多的测量任务.基于sketch的测量方法有两个特性:基于sketch的测量 ...

  6. DPDK运行出现EAL Error reading from file descriptor 23 Input output error

    原因 dpdk不支持该网卡导致,需要修改一行代码,跳过dpdk pci 检查. 解决方法 修改lib/librte_eal/linuxapp/igb_uio/igb_uio.c 将文件中该行修改 pc ...

  7. STM32F103 ucLinux开发之三(内核启动后不正常)(完结)

    STM32F103 ucLinux内核没有完全启动 从BOOT跳转到内核后,执行一长段的汇编语言,然后来到startkernel函数,开启C语言之旅. 但是内核输出不正常,如下所示: Linux ve ...

  8. JavaScript编写简单的增加与减少元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 2017年秋招美团Java程序员开发,看我如何拿到offer

    本人是一名本科毕业非计算机专业的程序员,面了阿里,结果没过,最后面上了美团,热乎乎的面经,昨天面的美团,虽然面完了HR面,但是感觉希望不大,希望能走运拿到offer吧.记性不是太好,有一些问题没能记住 ...

  10. Java 8-Stream流

    出处:Java 8 中的 Stream API详解 什么是流 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iter ...