WCF实例上下文基本内容概述

开发 开发工具
WCF实例上下文主要就是对服务实例的封装。它同时也是WCF管理服务实例生命周期的依托。在这里我们将会针对此做一个详细介绍。

WCF开发工具是一款由微软公司开发的功能强大的插件,它主要作用域通信方面,可以为开发人员带来非常大的好处。在这里我们将会为大家详细介绍一下有关WCF实例上下文的基本内容。#t#

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

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

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

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

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

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

  1. 1: public sealed class InstanceContext : CommunicationObject, 
    IExtensibleObject
    <InstanceContext>   
  2. 2: {   
  3. 3: //其他成员   
  4. 4: public InstanceContext(object implementation);   
  5. 5: public InstanceContext(ServiceHostBase host);   
  6. 6: public InstanceContext(ServiceHostBase host, object implementation);   
  7. 7:   
  8. 8: public object GetServiceInstance();   
  9. 9: public object GetServiceInstance(Message message);   
  10. 10: public void ReleaseServiceInstance();   
  11. 11:   
  12. 12: public IExtensionCollection<InstanceContext> Extensions { get; }   
  13. 13: public ServiceHostBase Host { get; }   
  14. 14: public ICollection<IChannel> IncomingChannels { get; }   
  15. 15: public ICollection<IChannel> OutgoingChannels { get; }   
  16. 16: public SynchronizationContext SynchronizationContext { get; set; }   
  17. 17: } 

InstanceContext具有三个构造函数,接受ServiceHostBase对象和具体的实例对象作为其输入参数。GetServiceInstance和ReleaseServiceInstance用户服务实例的获取和释放。IncomingChannels和OutgoingChannels则表示入栈和出栈信道集合。而通过SynchronizationContext属性则可以设置或获取用于异步操作的同步上下文,比如服务操作须要在非UI线程下操作一个Windows Form的控件,你就需要基于UI线程的同步上下文(SynchronizationContext)。

以上就是我们为大家介绍的WCF实例上下文相关内容。

责任编辑:曹凯 来源: CSDN
相关推荐

2010-03-02 15:53:02

WCF服务合同

2010-03-02 17:55:37

WCF终结点地址

2010-02-25 15:49:05

WCF消息模式

2010-02-25 17:51:04

WCF服务地址

2010-01-28 15:33:37

Android程序架构

2010-02-06 13:58:13

C++ Bost库

2017-05-11 14:00:02

Flask请求上下文应用上下文

2010-02-05 13:35:19

C++虚析构函数

2010-02-02 15:12:09

C++ explici

2022-09-14 13:13:51

JavaScript上下文

2012-12-31 10:01:34

SELinuxSELinux安全

2022-09-15 08:01:14

继承基础设施基础服务

2010-01-04 15:21:37

Silverlight

2023-07-11 10:02:23

2020-07-24 10:00:00

JavaScript执行上下文前端

2021-07-26 07:47:36

Cpu上下文进程

2024-11-14 09:00:00

Python上下文管理器

2017-12-17 17:01:23

限界上下文系统模型

2024-09-30 14:10:00

2022-10-28 16:24:33

Context上下文鸿蒙
点赞
收藏

51CTO技术栈公众号