在这种情况下,我看到线程的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查询后的日志时,我会看到类似的日志。
|线程|log|
|237|data 23|
|145|data 19|
>|872|data 78|
237|data 23|
我担心的是,为什么ID为237的线程会拾取旧数据?即23
我确信控件没有进入LogicalSetData代码块,因为它已经有数据了。
我不知道为什么会发生这种事?有人能帮我吗?
该服务是WCF数据服务。正在从邮递员REST客户端进行呼叫。
考虑切换到OperationContext
,因为它是内置的自然上下文,用于存储特定请求的数据
CallContext.GetData将从同一线程获取通过SetData设置的数据。通过CallContext.LogicalSetData存储的数据被认为是"逻辑线程"本地数据。也就是说,通过CallContext.LogicalSetData存储的任何数据都将"流"到任何子线程。如果您在同一个线程或任何子线程中调用CallContext.LogicalGetData,您将获得该线程(或父线程(对CallContext.LLogicalSetData的调用所存储的数据
我找不到在每次请求启动时CallContext必须是干净的任何信息,但我找到了这篇描述自定义ICallContextInitializer实现的旧文章。上面写着:
WCF默认情况下比其他堆栈(如ASP.NET(更节省它涉及到保护国家。保存和恢复大量线程本地设置需要时间,无论您是否真的是否使用了这些设置。WCF尽量不做那么多以您的名义,这样您就不必支付清理费用,除非您使用这些功能。然而,它确实为您提供了必要的钩子安排在适当的时间进行清理。