c# - 寻求通用的基于上下文的存储

标签 c# .net httpcontext thread-static

首先,我希望基于上下文的存储在整个框架中保持一致!

话虽如此,我正在寻找一种优雅的解决方案,使这些属性在 ASP.NET、WCF 和任何其他多线程 .NET 代码中都是安全的。这些属性位于一些低级跟踪助手中(如果您想知道为什么它们是内部的,这些属性是通过方法公开的)。

我宁愿不依赖不需要的程序集(如 System.Web 等)。我不想要求任何人使用此代码来配置任何东西。我只是想让它工作 ;) 虽然这可能太高了......

有人有什么 secret 吗? (看过Spring的实现)

    internal static string CurrentInstance
    {
        get
        {
            return CallContext.LogicalGetData(currentInstanceSlotName) as string;
        }
        set
        {
            CallContext.LogicalSetData(currentInstanceSlotName, value);
        }
    }

    internal static Stack<ActivityState> AmbientActivityId
    {
        get
        {
            Stack<ActivityState> stack = CallContext.LogicalGetData(ambientActivityStateSlotName) as Stack<ActivityState>;
            if (stack == null)
            {
                stack = new Stack<ActivityState>();
                CallContext.LogicalSetData(ambientActivityStateSlotName, stack);
            }

            return stack;
        }
    }

更新

安全并不是指同步。问题背景 here

最佳答案

这里是(至少部分)NHibernate 的“上下文”实现的链接:

https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Context/

我不清楚这在 NHibernate 的上下文中究竟在哪里或如何发挥作用。也就是说,如果我想在“上下文”中存储一些值,我会从 NHibernate 获取“上下文”并添加我的值吗?我不使用 NHibernate,所以我真的不知道。

我想您可以自行查看并确定这种实现方式是否对您有用。显然,这个想法是根据应用程序的类型(ASP.NET、WCF 等)注入(inject)所需的实现。这可能意味着一些配置(如果要使用 MEF 加载“the”ICurrentSessionContext 接口(interface),则可能是最小配置)。

无论如何,当我前段时间搜索关于CallContext.SetData/GetData/LogicalSetData/LogicalGetDataThread.SetData/GetData<的信息时,我发现这个想法很有趣[ThreadStatic]

此外,根据您对 CallContext.LogicalSetData 而不是 CallContext.SetData 的使用,我假设您想要利用与逻辑相关联的信息这一事实thread 将传播到子线程,而不是只想要一个“线程安全”的地方来存储信息。因此,如果您要在应用启动时设置(pr Push)AmbientActivity,然后不再推送任何事件,则任何后续线程也将成为同一事件的一部分,因为通过 LogicalSetData 存储的数据由子线程继承。

如果您在第一次提出这个问题后学到了什么,我将非常有兴趣了解它。即使您还没有,我也会有兴趣了解您在上下文中所做的事情。

目前,我正在努力维护一些用于日志记录/跟踪的上下文信息(类似于 Trace.CorrelationManager.ActivityId 和 Trace.CorrelationManager.LogicalOpertionStack 以及 log4net/NLog 上下文支持)。我想保存一些上下文(当前应用程序、当前应用程序实例、当前事件(可能是嵌套的))以用于应用程序或 WCF 服务,并且我想跨 WCF 服务边界“自动”传播它。这是为了允许记录在中央存储库中的日志语句通过客户端/事件/等进行关联。我们将能够通过特定应用程序的特定实例查询和关联所有日志记录语句。日志记录语句可能已在客户端或一个或多个 WCF 服务中生成。

ActivityId 的 WCF 传播对我们来说不一定足够,因为我们想要传播(或我们认为我们这样做)的不仅仅是 ActivityId。此外,我们希望将此信息从 Silverlight 客户端传播到 WCF 服务,而 Trace.CorrelationManager 在 Silverlight 中不可用(至少在 4.0 中不可用,也许将来会提供类似的东西)。

目前,我正在使用 IClientMessageInspector 和 IDispatchMessageInspector 制作“上下文”信息传播的原型(prototype)。看起来它可能对我们有用。

关于对 System.Web 的依赖性,NHibernate 实现确实有一个“ReflectiveHttpContext”,它使用反射来访问 HttpContext,因此不会有对 System.Web 的项目依赖性。显然,如果将 HttpContext 配置为使用,则 System.Web 必须在部署应用程序的位置可用。

关于c# - 寻求通用的基于上下文的存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735797/

相关文章:

c# - 从窗口句柄获取窗口实例

c# - 如何在 MVVM View 模型中处理 C# WPF 线程

cookies - 如何在服务器端 Blazor 中访问 HttpContext?

c# - 任何人都可以将这 3 个 LINQ to SQL 语句缩减为一个吗?

.net - 设置Datasource后DataGridView为空

http - 如何在 golang 中获取 http 请求的初始时间戳?

c# - 这两个 HttpContext.Current.Session 和 Session 有什么区别 - asp.net 4.0

c# - 创建使用一个 foreach 而不是多个的方法

c# - 项目间资源共享策略

c# - 基于 Excel 工作表更改启用/禁用功能区按钮 - VSTO