zoukankan      html  css  js  c++  java
  • .net 常识 CallContext

    关于HttpContext.Current可能挺多人都有疑问的

    他究竟是怎么实现的呢

    为什么每个不同的请求去访问一个静态成员Current 能得到不同的结果呢?

    很明显的这个静态对象和当前调用的Context有关

    其内部实现类似于 CallContext.SetData() 和CallContext.GetData()

    通过SetData保存的数据 是和当前方法的调用堆栈有关的,例如你在方法A中间SetData

    然后方法A中Call了方法B  那么B中可以用GetData()获得数据,反过来也是ok的

    只要在这个方法堆栈上 都可以互相使用这些Data

    例如以下代码

    public static WcfTransaction Transaction
    {
    get
    {
    return CallContext.LogicalGetData("WcfTransaction") as WcfTransaction;
    }
    set
    {
    CallContext.LogicalSetData(
    "WcfTransaction", value);
    }
    }

    PS:LogicalGetData 和 GetData的差别主要是 LogicalGetData能适应更多的情况

    例如在跨AppDomian的时候 在外面SetData 在另外一个AppDomain里面GetData就获取不到值了 ,而LogicalGetData 还能继续使用,

    此外如果让上文中的WcfTrancation 继承特定接口 也可以自动传播到更多的地方..不过生命周期就不好控制了

     CallContext是和调用堆栈相关的

    ,下篇介绍和线程相关的数据....虽然大部分时候这两个有很大重叠..

  • 相关阅读:
    学习笔记之jq
    学习笔记之pytest
    本月学习小结(01/10
    本月学习小结(01/09
    学习笔记之Poetry
    学习笔记之Dynaconf
    学习笔记之asyncio — Asynchronous I/O
    Redis 根据key获取所有 HashKey
    Java ffmpeg 合成音视频文件
    Redis 存储中文方式
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2001374.html
Copyright © 2011-2022 走看看