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)
向前传递数据时的 Swift 有趣的 NSExceptionError
74CallContext线程数据缓存-调用上下文 System.Runtime.Remoting.Messaging,JOIN序列化过程中日期的处理