WCF服务对象实例化基础

时间:2022-09-18 23:41:15

很多情况下,我们都需要控制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服务对象实例化基础

如何实现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服务*享全局数据
  • 不考虑扩展

WCF服务对象实例化基础的更多相关文章

  1. WCF分布式开发步步为赢(1):WCF分布式框架基础概念

    众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...

  2. WCF 学习系列——WCF的学习基础

    这个系列的博客由WCF4 高级编程学习记录,如有错误请指正. 首先介绍一些概念: SOA: (Service-Oriented Architecture 面向服务架构),一种架构方法,也是一种编程模式 ...

  3. WCF服务编程-基础

    WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...

  4. WCF实例管理的三种方式

    很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...

  5. WCF入门教程:WCF基础知识问与答(转)

    学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...

  6. WCF基础教程——vs2013创建wcf应用程序

    引言   近期在项目中见到了师哥们常常谈到的WCF这方面的知识.当时在写程序的时候也没有理解wcf究竟是个什么东西? 以及我们为什么在项目中会採用这种框架来实现,仅仅是依照师哥他们写好的代码编写同样格 ...

  7. &period;NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(&period;NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C&num; &period;NET 0配置使用Wcf&lpar;半成品&rpar; C&num; &period;NET Socket 简单实用框架 C&num; &period;NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  8. 【WCF】基址与默认终结点

    五月份的时候,有位老友给老周提了个建议:希望老周写一写WCF的文章.其实老周以前是写过WCF的文章的,只是不是写在这个博客里,老周并不打算把X年前的博客导进来,要写的话,重新写吧.毕竟,那个时候写的文 ...

  9. WCF分布式开发步步为赢&lpar;2&rpar;自定义托管宿主WCF解决方案开发配置过程详解

    上一节<WCF分布式框架基础概念>我们介绍了WCF服务的概念和通信框架模型,并给出了基于自定义托管服务的WCF程序的实现代码.考虑到WCF分布式开发项目中关于托管宿主服务配置和客户端添加引 ...

随机推荐

  1. 安装mysql步骤

    1.yum install lrzsz 安装上传功能2.查看系统是否装有MySql  :rpm -qa | grep mysql3.查看系统Mysql位置 :whereis mysql4.卸载Mysq ...

  2. 百度上传android包:应用名解析失败!

    manifest 里面<application增加android:label="@string/app_name"

  3. 写一个函数,将一个int型的数组做为参数传入,使用指针返回两个结果&colon;最大值和最小值

    今日下午研究了一下c语言中的指针问题,c语言的核心是指针,指针的核心是地址,地址的核心是内存. #include <stdio.h> void hanshu(int *arry,int s ...

  4. 关于HttpClient重试策略的研究

    一.背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信.对于交易类的接口,订单状态是至关重要的. 这就牵扯到一系列问题: HttpClient是否有默认 ...

  5. Windows 2008 r2上安装MySQL

    用MSI安装包安装 根据自己的操作系统下载对应的32位或64位安装包.按如下步骤操作: MySQL数据库官网的下载地址http://dev.mysql.com/downloads/mysql,第一步: ...

  6. C语言中关键字restrict的概念,使用范围,例子

    概念: restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容. 渊源: res ...

  7. 网络流量状态命令总结 &lpar;含notp安装&rpar;

    1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众多统计数据.其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收 ...

  8. PHP&lowbar;CodeSniffer 使用攻略

    安装 PHP_CodeSniffer 安装 phpcs phpcs 是 PHP 代码规范的检测工具. # 下载 $ curl -OL https://squizlabs.github.io/PHP_C ...

  9. python网络编程-socketserver

    一:socketserver简化了网络服务器的编写. 它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer. 这4个类是同步进行处 ...

  10. Python实现二叉树的遍历

    二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉 ...