WCF服务对象实例化基础

不少状况下,咱们都须要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间。框架

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

WCF服务对象实例化基础

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

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

在建立WCF服务端对象时有下列三种不一样的方式线程

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

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

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

每次调用模式

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

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

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

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

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Percall)]内存

public class Service:IService资源

{rem

    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服务中共享全局数据
  • 不考虑扩展
相关文章
相关标签/搜索