CallContext向前传送之前设置的数据

时间:2018-07-23 07:59:32

标签: c# wcf-data-services threadstatic callcontext

在这种情况下,我看到线程的CallContext在后续调用中预先携带了数据。

考虑到我有一个简单的API,当查询该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 个答案:

答案 0 :(得分:1)

考虑切换到OperationContext,因为它是内置的自然上下文,用于存储特定请求的数据
CallContext.GetData将获取通过设置的数据来自同一线程的SetData。通过CallContext.LogicalSetData存储的数据被视为本地“逻辑线程”。也就是说,通过CallContext.LogicalSetData存储的任何数据都将“流”到任何子线程。如果在同一线程或任何子线程中调用CallContext.LogicalGetData,则将获得该线程(或父线程)对CallContext.LogicalSetData的调用存储的数据。更好的描述in this great article
我找不到在每次请求启动时CallContext必须清除的任何信息,但是我发现this old article,描述了自定义ICallContextInitializer实现。它说:

  

默认情况下,WCF比其他堆栈(例如ASP.NET)更加节俭。   涉及保护国家。保存和还原很多   线程本地设置需要时间,无论您是否实际   是否使用这些设置进行了操作。 WCF尝试不做太多事情   代表您,这样您就不必支付清理费用,除非您   使用这些功能。但是,它确实为您提供了必要的挂钩   安排在适当的时候进行清理。