[原创]WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[第1篇]

服务调用的目的体现在对某项服务功能的消费上,而功能的实现又定义在相应的服务类型中。不论WCF服务端框架处理服务调用请求的流程有多么复杂,最终都落实在服务实例的激活和操作方法的执行上面。WCF中的实例管理(Instance Management)旨在解决服务实例的激活和服务实例生命周期的控制。

会话(Session)的目的在于保持来自相同客户端(服务代理)多次服务调用之间的状态。从消息交换的角度来讲,会话通过消息识别机制判断调用某个服务的消息来源,从而将来自相同客户端的所有消息关联在一起。所以,会话实现了消息关联(Message Correlation)。

实例与会话是WCF非常重要的两个特性,它们既相对独立,又互相制约。实例模式与对会话支持程度的不同组合,会让最终的服务表现出截然不同的行为。对实例管理和会话的合理利用,对于改善和提高WCF服务应用的可扩展性(Scalability)、性能(Performance)、吞吐量(Throughput)等具有决定性作用。服务实例对象并不是孤立存在的,而是被封装到一个特殊实例上下文(InstanceContext)对象之中,本系列文章从实例上下文说起。

一、实例上下文(InstanceContext)

实例上下文是对服务实例的封装,是WCF管理服务实例生命周期的依托。我们先撇开WCF,来简单介绍一下在托管的环境中,公共语言运行时(CLR)是如何进行托管对象的生命周期的。在一个托管应用程序中,我们通过不同的方式创建一个托管对象(比如通过new关键字、反射或反序列化等)时,CLR会在托管堆为该对象开辟一块内存空间。对象的本质就是存储于某块内存中数据的体现,对象的生命周期终止于相应内存被回收之时。对于CLR来说,负责对托管堆(在这里主要指GC堆)进行回收的组件是垃圾收集器(GC),GC掌握着托管对象的生杀大权,决定着托管对象的生命周期。

当GC在进行垃圾回收的时候,会将“无用”的对象标记为垃圾对象,然后再对垃圾对象进行清理。GC对“无用”对象的识别机制很简单:判断对象是否被“根(Root)”所引用。在这里,“根”是对一组当前正被使用,或者以后可能被使用的对象的统称,大体包括这样的对象:类型的静态字段或当前的方法参数和局部变量、CPU寄存器等。

所以,孤立存在的对象将难逃被GC回收的厄运。反之,如果希望某个对象常驻内存中,我们唯一的方式就是通过某个“根”引用该对象。本章所讲的实例管理,就是对服务实例生命周期的管理,即让服务实例按照我们希望的方式创建、存活和消亡,所以我们唯一的方式也只能是:在希望服务实例存活的时候让它被某个“根”引用,从而阻止GC将其回收;在希望服务实例被回收的时候连“根”去除,使GC能够将其回收。而本节所讲的实例上下文(InstanceContext)就扮演着“根”的角色。

说到实例上下文,相信读者不会感到陌生,因为在进行WCF双向(Duplex)通信的时候,我们通过实例上下文来封装回调对象。在WCF中,实例上下文不仅仅用于对回调对象的封装,也用于对真正服务实例的封装。实际上可以将WCF的双向通信理解成一种对等通信,通信的双方是对等的参与者,并没有严格的服务端和客户端之分,或者说通信的双方交替地扮演着服务与客户的角色。客户端正常调用服务端操作是一种服务调用;服务端回调客户端操作也可以看成是一种服务调用。因此,通过实例上下文对回调对象和服务实例进行封装本质上是一致的。

实例上下文对服务实例的封装大体可以通过图1表示。一个WCF服务通过一个ServiceHost进行寄宿,并添加一到多个终结点。对于接收到的服务调用请求,如果相应的实例上下文存在,则通过它得到服务实例来处理服务请求,否则创建服务实例并通过实例上下文对其进行封装,然后再通过实例上下文得到具体的服务实例进行服务请求处理。

clip_image002

图1 实例上下文对服务实例的封装

实例上下文通过类型System.ServiceModel.InstanceContext表示。InstanceContext继承自CommunicationObject,实现了IExtensibleObject<InstanceContext>接口。InstanceContext的定义如下面的代码所示:

   1: public sealed class InstanceContext : CommunicationObject, IExtensibleObject<InstanceContext>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WCF是一种用于创建分布式系统的技术,可与vb.net一起使用。 WCF中可以使用多种协议进行网络通信,例如HTTP,TCP和MSMQ等。下面是一个vb.net的WCF网络通信实例: 首先,要创建一个WCF服务,您可以使用Visual Studio中的模板。在创建服务时,可以选择使用什么类型的绑定和协议。例如,默认情况下会使用基本HTTP绑定和HTTP协议。 在服务中定义操作合同,这些合同将服务公开为web服务,可以使用它们来处理远程请求。 在客户端应用程序中,您需要首先添加服务引用,可以通过Visual Studio的“添加服务引用”向导来完成。然后,您可以使用该服务的客户端代理来调用远程服务,就像在本地应用程序中一样。 以下是一个简单的WCF服务和客户端应用程序示例: 服务代码: ```vb.net Imports System.ServiceModel <ServiceContract()> Public Interface ICalculator <OperationContract()> Function Add(ByVal x As Double, ByVal y As Double) As Double End Interface Public Class Calculator Implements ICalculator Public Function Add(ByVal x As Double, ByVal y As Double) As Double Implements ICalculator.Add Return x + y End Function End Class Sub Main() Dim host As New ServiceHost(GetType(Calculator)) host.Open() Console.WriteLine("Service started. Press any key to stop.") Console.ReadLine() host.Close() End Sub ``` 客户端代码: ```vb.net Module Module1 Sub Main() Dim client As New CalculatorClient() Console.WriteLine("2 + 3 = " & client.Add(2, 3)) client.Close() Console.ReadLine() End Sub End Module <ServiceContract()> Public Interface ICalculator <OperationContract()> Function Add(ByVal x As Double, ByVal y As Double) As Double End Interface Public Class CalculatorClient Inherits ClientBase(Of ICalculator) Implements ICalculator Public Function Add(ByVal x As Double, ByVal y As Double) As Double Implements ICalculator.Add Return Channel.Add(x, y) End Function End Class ``` 在这个例子中,我定义了一个名为“Calculator”的简单计算器服务,它具有一个Add操作。在客户端应用程序中,我使用了一个名为“CalculatorClient”的客户端代理来调用Add操作,该代理使用了WCF中的默认HTTP绑定和HTTP协议来与服务通信。 这就是一个简单的WCF网络通信示例,您可以开始使用WCF来创建自己的分布式应用程序,用于实现您的网络通信需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值