3

我有这种情况,我看到线程的 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 客户端进行呼叫。

4

1 回答 1

3

考虑切换到,因为它是为特定请求OperationContext存储数据的内置和自然上下文。CallContext.GetData 将从同一线程获取通过 SetData 设置的数据。通过 CallContext.LogicalSetData 存储的数据被认为是本地的“逻辑线程”。也就是说,通过 CallContext.LogicalSetData 存储的任何数据都将“流向”任何子线程。如果您在同一个线程或任何子线程中调用 CallContext.LogicalGetData,您将获得由该线程(或父线程)调用 CallContext.LogicalSetData 存储的数据。这篇很棒的文章中有更好的描述。我找不到任何信息表明 CallContext 在每次请求开始时必须是干净的,

,描述自定义 ICallContextInitializer 实现。它说:

在保护状态方面,默认情况下 WCF 比其他堆栈(例如 ASP.NET)更节俭。保存和恢复大量线程本地设置需要时间,无论您是否对这些设置进行了实际操作。WCF 尽量不代表您做太多事情,这样您就不必为清理付费,除非您使用这些功能。但是,它确实为您提供了安排此清理在适当时间进行所需的挂钩。

于 2018-07-23T10:54:32.523 回答