zoukankan      html  css  js  c++  java
  • WCF实例管理的三种方式

    很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间。

    Wcf框架提供了三种创建wcf实例的方式。

    WCF服务对象实例化基础

    在普通的WCF请求和相应过程中,将产生下列活动:

    • WCF客户端向WCF服务端对象发起一个请求。
    • WCF服务端对象实例化
    • WCF服务实例响应请求并给客户端发送响应

    在创建WCF服务端对象时有下列三种不同的方式

    • 为每个WCF客户端请求创建一个新的WCF服务端实例
    • 为每个WCF客户端会话只创建一个WCF实例
    • 所有的WCF客户端都使用一个全局的WCF服务端实例

    针对上述场景,WCF提供了三种便捷方式

    • 每次调用
    • 每个会话
    • 单个实例

    每次调用模式

    当我们将WCF服务设置为每次调用模式时,在使用WCF代理客户端每次方法调用时都将产生新的服务端实例

    • WCF客户端第一次调用
    • 服务端为客户端的这个方法调用创建新的实例
    • WCF服务处理请求并向客户端发送应答,销毁服务实例,让gc来清理
    • 当客户端第二次调用了第二个方法时,创建了新的实例,处理请求,销毁实例

    如何实现WCF的每次调用实例化模式

    要指定实例化模式,我们需要在标签ServiceBehavior中提供InstanceContextMode的值。这个标签是放在Service类上的。如下列代码所示:

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Percall)]

    public class Service:IService

    {

        private int intCounter;

        public int Increment()

        {

            intCounter++;

            return intCounter;

        }

    }

    假定在客户端两次调用该方法

    ServiceReferrence1.ServiceClient obj=new ServiceReference1.ServiceClient();

    MessageBox.Show(obj.Increment().ToString());

    MessageBox.Show(obj.Increment().ToString());

    此时,尽管我们调用了两次Increment方法,但是得到的结果都是'1'。换句话说,WCF服务实例在每次方法调用时都被重新创建了,所以这个值始终为1。

    每次会话实例模式

    很多时候,我们都需要在多个方法调用时或者针对一个特定的会话来维护状态。对于这样的场景,我们就需要将服务配置为每个会话模式。在每个会话模式时,

    在一次会话的交互过程中将只创建一个WCF服务对象,过程如下:

    • 客户端创建WCF服务代理,进行方法调用
    • 创建一个服务实例来处理方法响应
    • 客户端在同一个会话中做一个或多个方法调用
    • 使用同一个服务实例来处理这些方法调用
    • 当客户端结束了它的活动时,销毁WCF实例,提供给gc来清理资源

    如何实现会话实例模式

    要将服务配置为每个会话模式,我们需要配置标签ServiceBehavior的InstanceContextMode对象的值设置为PerSession

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]

    public class Service:IService

    {

        private int intCounter;

        public int Increment()

        {

            intCounter++;

            return intCounter;

        }

    }

    在客户端,当使用如下代码时,在客户端最后的代码执行时,将得到'2'

    ServiceReference1.ServiceClient obj=new ServiceReference1.ServiceClient();

    MessageBox.Show(obj.Increment().ToString());

    MessageBox.Show(obj.Increment().ToString());

    单例模式

    有时候我们也会创建一个全局WCF实例为所有的WCF客户端提供服务。要创建一个单例模式WCF服务,可采取如下方式:

    WCF客户端向服务端发起一个请求

    创建一个服务端实例来为请求服务。这个实例不会被销毁,而是持续为其他客户端请求服务

    假如这时候,某个其他的客户端如Client2,请求了同一个方法调用

    将使用这个唯一的服务实例(由Client1创建的)来为Client2提供服务。

    如何实现单例模式

    为实现单例模式,将InstanceContextMode设置为Single

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

    public class Service:IService

    {

    }

    当你从不同的客户端发起请求时,这个Counter计数同样会增加。该Counter技术成为了一个全局变量

    使用每次调用,每个会话,单例模式的选择依据

    每次调用

    无状态服务

    • 服务持有了大量资源时,如连接对象和大量的内存对象
    • 最主要的需求是可扩展,需要使用一个可扩展体系时
    • 在调用WCF函数时是在一个单线程模式时

    每个会话

    • 你需要在多个WCF调用之间维护状态时
    • 扩大体系时?
    • 轻量级资源引用

    单例

    • 想在你的WCF服务中共享全局数据
    • 不考虑扩展
  • 相关阅读:
    css
    page
    Process Array
    multiprocessing
    page
    mid
    防御 CSRF
    django 常用过滤器
    template
    Android学习笔记28-对话框Dialog控件的使用
  • 原文地址:https://www.cnblogs.com/CSharpLover/p/5690791.html
Copyright © 2011-2022 走看看