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


    WCF IDisposable接口应用功能详解WCF客户端具体搭建方法解析WCF扩展点在自定义运行时使用两个基本WCF应用技巧总结引用WCF服务正确实现方法介绍

     

    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: public sealed class InstanceContext : CommunicationObject, IExtensibleObject<InstanceContext>   

    2: {   

    3: //其他成员   

    4: public InstanceContext(object implementation);   

    5: public InstanceContext(ServiceHostBase host);   6: public InstanceContext(ServiceHostBase host, object implementation);   

    7:   

    8: public object GetServiceInstance();   

    9: public object GetServiceInstance(Message message);   

    10: public void ReleaseServiceInstance();   

    11:   

    12: public IExtensionCollection<InstanceContext> Extensions { get; }   

    13: public ServiceHostBase Host { get; }   

    14: public ICollection<IChannel> IncomingChannels { get; } 

    15: public ICollection<IChannel> OutgoingChannels { get; } 

    16: public SynchronizationContext SynchronizationContext { get; set; }   17: } 

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

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

  • 相关阅读:
    Redis分布式锁的正确实现方式
    Redis+Jedis封装工具类
    MyCat配置文件详解--server.xml
    linux buff/cache释放
    mycat中间件--schema.xml配置文件详解
    mycat中间件--linux安装mycat1.6版本
    如何查找SHELL的进程号并杀死
    dubbo常用配置及注意事项
    xxxx
    解决docker镜像无法下载的问题
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2009356.html
Copyright © 2020-2023  润新知