在这种情况下,我看到线程的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查询之后看到日志时,我会看到类似的日志。
\x{e76f}线程/日志
237个数据23
145数据19
#^ data #^data 872 #^data数据#^data#^data
237个数据23
我担心的是,为什么使用ID 237的线程会收集旧数据?即23
我确信控件没有进入LogicalSetData代码块,因为它已经有数据了。
我不知道为什么会这样?有人能帮我吗?
该服务是WCF数据服务。正在从邮递员REST客户端打电话。
发布于 2018-07-23 10:54:32
考虑切换到OperationContext,因为它是为特定请求存储数据的内置和自然上下文。
CallContext.GetData将从同一个线程获取通过SetData设置的数据。通过CallContext.LogicalSetData存储的数据被认为是本地的“逻辑线程”。也就是说,通过CallContext.LogicalSetData存储的任何数据都将被“流”到任何子线程。如果在同一个线程或任何子线程中调用CallContext.LogicalGetData,则将得到该线程(或父线程)调用CallContext.LogicalSetData所存储的数据。更好的描述在这篇伟大的文章。
在每次请求启动时,我都找不到CallContext必须干净的任何信息,但是我找到了描述自定义ICallContextInitializer实现的这篇旧文章。上面写着:
在保护状态方面,WCF在默认情况下比其他堆栈(如ASP.NET )更节省。保存和恢复大量线程本地设置需要时间,无论您是否实际使用这些设置。WCF试图不为您做那么多事情,这样您就不必为清理付费,除非您正在使用这些特性。然而,它确实为您提供了必要的钩子,以安排在适当的时间进行清理。
https://stackoverflow.com/questions/51474074
复制相似问题