• 跟着Artech学习WCF扩展(3) 扩展CallContextInitializer


    代码下载:点我   作为备份

    Artech的代码要在他的博客里面找的

    Artech大师级的“总分总”式的风格,的确是和高手过招用,作为一面菜鸟,纠结了老半天才明白,原来写博客也可以前后呼应

    于是把这个小节点整理到一起已被以后不时只需

    5 、自定义CallContextInitializer (Step 12 & Step 18)

    提到CallContextInitializer,我想有一部分人会马上想到System.Runtime.Remoting.Messaging.CallContext。CallContext为我们创建基于当前线程的Ambient context提供了便利。通过CallConext,我们和容易地将一些contextual information保存在TLS(Thread Local Storage)中。

    类似地,DispatchOperation的CallContextInitializers提供了一个 CallContextInitializer的集合,这些CallContextInitializer可以帮助我们对TLS进行初始化和释放回收的工作。比如在某个service 方法被真正之前,我们希望设置一些Context的数据,这些数据可能使业务有关,但大部分是和具体的业务逻辑没有关系的,比如一些Auditing的数据。在方式执行完成后,对这些context数据进行清理和回收。 WCF下的所有CallContextInitializer实现了System.ServiceModel.Dispatcher.ICallContextInitializer interface:

    public interface ICallContextInitializer
    {
        // Methods
        void AfterInvoke(object correlationState);
        object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message);
    } 

    再给大家介绍一个使用CallContextInitializer的场景。假设有一个service专门提供 message,考虑到Localization,当客户访问你的service获取某项message entry的时候,你希望根据该client的当前culture/UI culture返回具体的message。但是你不希望将这个culture作为API的一部分。这样你就可以这样做:在client端,通过自定义ClientMessageInspector将当前的Culture附加到outgoing message的header中。在service端,通过一个自定义的CallContextInitializer,将culture的值从incoming message header取出,并用这个culture设置当前线程的Culture和UICulture。那么message的获取只需要考虑当前线程的Culture就可以了。我将在本系列后续的文章介绍这个应用。

    剩下的地方在Artech这里:点我

    看Artech文章时,一直在郁闷,到底什么是扩展?为什么介绍了一个接口,又介绍一个接口,知道把文章全部看了一边,虽然没看懂,才知道这家伙小时候写作文喜欢“总-分”式,

    wcf整体来说的结构模型感觉和iis是一个思想的产物,都是管道模型,然后信息和数据从这个管道留到另外一个管道,

    扩展的地方主要是要弄清楚3点

    1:要扩展哪一个环节

    2:扩展的这个环节要解决什么问题

    3:扩展的这个环节如何附加到管道和管道的交界处

    对与CallContextInitializer扩展防范只有一个

    但将扩展应用到管道有两种方式

    1通过OperationBehavior应用CallContextInitializer

    2通过EndpointBehavior运用CallContextInitializer

    而通过EndpointBehavior将扩展附加到管道上时可以配置的相对来说较为灵活

    Artech的例子也是这么做例子的

    test
  • 相关阅读:
    模板的一些概念和技巧
    [转] Linux TCP/IP网络小课堂:net-tools与iproute2大比较
    [转] boost库的Singleton的实现以及static成员的初始化问题
    static对象的高级用法
    const中的一些tricky的地方
    delphi软件启动的顺序解密。
    属性名、变量名与 内部关键字 重名 加&
    delphi Inc函数和Dec函数的用法
    Centos 关闭防火墙
    IntelliJ IDEA 启动方法
  • 原文地址:https://www.cnblogs.com/qqloving/p/2200113.html
Copyright © 2020-2023  润新知