CallContext 正在向前传递之前设置的数据

Posted

技术标签:

【中文标题】CallContext 正在向前传递之前设置的数据【英文标题】:CallContext is carrying foreward the previous data which was set 【发布时间】:2018-12-30 15:03:05 【问题描述】:

我有这种情况,我看到线程的 CallContext 在后续调用中向前传递数据。

假设我有一个简单的 API,当被查询时,它将使用以下方法将一个数据条目设置到 CallContext 中:

// entry to the API execution within OnStartProcessingRequest method of DataService
if(CallContext.LogicalGetData("data") != null)
    CallContext.LogicalSetData("data", someValue)
print("data " + CallContext.LogicalGetData("data"))

当我在一些 API 查询后看到日志时,我会看到类似的日志。

|线程 |日志 | | 237 |数据 23 | | 145 |数据 19 | |第872章数据 78 | | 237 |数据 23 |

我担心为什么 ID 为 237 的线程会提取旧数据?即 23 我确定控件没有进入 LogicalSetData 代码块,因为它已经有数据。

我不确定为什么会这样?谁能帮我解决这个问题?

该服务是 WCF 数据服务。正在从邮递员 REST 客户端进行调用。

【问题讨论】:

【参考方案1】:

考虑切换到OperationContext,因为它是存储数据的内置自然上下文针对特定请求。CallContext.GetData 将从相同的线程。通过 CallContext.LogicalSetData 存储的数据被认为是本地的“逻辑线程”。也就是说,通过 CallContext.LogicalSetData 存储的任何数据都将“流向”任何子线程。如果您在同一线程或任何子线程中调用 CallContext.LogicalGetData,您将获得由该线程(或父线程)调用 CallContext.LogicalSetData 存储的数据。更好的描述 in this great article。 我找不到任何信息表明 CallContext 在每次请求开始时必须是干净的,但是我找到了 this old article,描述了自定义 ICallContextInitializer 实现。它说:

默认情况下,WCF 比其他堆栈(例如 ASP.NET)更节俭,当 说到保护国家。保存和恢复大量 线程本地设置需要时间,不管你是否真的 是否对这些设置进行了处理。 WCF 尽量不做那么多 代表您,这样您就不必支付清理费用,除非您是 使用这些功能。但是,它确实为您提供了必要的钩子 安排在适当的时间进行清理。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @Nic3500 我添加了一个链接,因为它描述了相同的情况。但答案是纯文本:“考虑切换到 OperationContext”。仅此而已,没有什么隐藏的。现在删除了链接。我觉得没关系。 @d_f 谢谢!目前我在发送回复之前正在清理 CallContext。工作得很好。但会考虑使用 OperationContext 来实现它。

以上是关于CallContext 正在向前传递之前设置的数据的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何保证对象线程内唯一:数据槽(CallContext)

CallContext

java向前引用和向后引用是啥概念

向前传递数据时的 Swift 有趣的 NSExceptionError

74CallContext线程数据缓存-调用上下文 System.Runtime.Remoting.Messaging,JOIN序列化过程中日期的处理

使用CallContext存储WCF的HttpContext