首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CallContext正前移先前设置的数据。

CallContext正前移先前设置的数据。
EN

Stack Overflow用户
提问于 2018-07-23 07:59:32
回答 1查看 635关注 0票数 3

在这种情况下,我看到线程的CallContext在随后的调用中向前移动数据。

假设我有一个简单的API,当被查询时,它将使用以下方法将一个数据输入设置到CallContext:

代码语言:javascript
复制
// 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客户端打电话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-23 10:54:32

考虑切换到OperationContext,因为它是为特定请求存储数据的内置和自然上下文。

CallContext.GetData将从同一个线程获取通过SetData设置的数据。通过CallContext.LogicalSetData存储的数据被认为是本地的“逻辑线程”。也就是说,通过CallContext.LogicalSetData存储的任何数据都将被“流”到任何子线程。如果在同一个线程或任何子线程中调用CallContext.LogicalGetData,则将得到该线程(或父线程)调用CallContext.LogicalSetData所存储的数据。更好的描述在这篇伟大的文章

在每次请求启动时,我都找不到CallContext必须干净的任何信息,但是我找到了描述自定义ICallContextInitializer实现的这篇旧文章。上面写着:

在保护状态方面,WCF在默认情况下比其他堆栈(如ASP.NET )更节省。保存和恢复大量线程本地设置需要时间,无论您是否实际使用这些设置。WCF试图不为您做那么多事情,这样您就不必为清理付费,除非您正在使用这些特性。然而,它确实为您提供了必要的钩子,以安排在适当的时间进行清理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51474074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档