【发布时间】:2019-05-14 11:56:02
【问题描述】:
Asp.Net Core 是否跨请求保留 CallContext?
我们有一个用例将上下文属性(用户名)附加到线程,可以从我们的日志框架(NLog,MDLC)中提取。据我所知,MDLC 使用CallContext。
我们需要每个请求都具有清晰的上下文属性。是否需要一开始就清除CallContext?
【问题讨论】:
-
你不应该在异步场景中依赖
TLS。使用CallContext或AsyncLocal<T>。 -
当您说跨请求时,您的意思是跨向您的 API 发出的连续 HTTP 请求吗?如果是这样,那么您不能保证它们无论如何都会针对同一个线程运行。整个方法似乎有点缺陷。
-
@tukaef 我们正在使用github.com/NLog/NLog/wiki/MDLC-Layout-Renderer。没有关于它如何工作的大量文档,但看起来它使用了 CallContext。我已经改写了我的问题。
-
我真的不明白你想要完成什么,但你肯定不想将用户名之类的东西附加到线程上。在像 Web 服务器这样的多线程环境中,特定用户可以使用任意数量的不同线程,即使在同一个请求期间也是如此。你最终会在用户请求中泄漏。
-
@ChrisPratt 澄清一下,我们的用例是我们需要捕获与请求关联的用户名(通过 HTTP 标头传递)并将其记录在所有下游日志中。正如您所说,这是一个异步环境,请求可以切换线程。但是我认为 LogicalCallContext 应该通过 async / await (如果不是 Task.Run)。在我们的日志输出中,如果
HTTPContex.Current可用,我们会从 HTTP 标头捕获用户名,并回退到填充在中间件中的 LogicalCallContext。如果这不是正确的方法,您能推荐一个更好的方法吗?
标签: c# asp.net-core nlog