gpt4 book ai didi

c# - LogicalCallContext 不在 HttpApplication BeginRequest 事件和请求的其余部分之间流动?

转载 作者:行者123 更新时间:2023-11-30 22:09:46 27 4
gpt4 key购买 nike

我正在尝试向 .NET Mvc 应用程序中的每个请求添加一些请求上下文信息。我为此目的使用 LogicalCallContext,因为我的请求有时会调用异步任务。但是,我发现在 BeginRequest 事件期间放置在逻辑调用上下文中的项目在管道后面的操作方法中不可用。谁能解释这种行为?我正在使用 .NET 4.5。

下面是一些示例代码:

public class MyApp : HttpApplication
{
public override void Init()
{
this.BeginRequest += (sender, args) =>
{
CallContext.LogicalSetData("MyRequestId", Guid.NewGuid().ToString());
};
}
}

// in the action method
public ActionResult Action() {
var requestId = CallContext.LogicalGetData("MyRequestId");
// requestId is null?!
}

最佳答案

事件一个接一个地处理,如果有一个事件异步结束,下一个事件会被放到线程池的队列中,等有线程空闲时再处理。

ASP.NET 代码使用调用上下文来跟踪线程内的 HttpContext,但这是在处理每个事件时专门设置的,这意味着您有一个新的调用上下文每个事件。

这里有一篇文章展示了线程切换是如何在事件之间工作的: http://forum.springframework.net/showthread.php?572-CallContext-vs-ThreadStatic-vs-HttpContext

要将任何数据从一个事件保存到另一个事件,请使用 HttpContext

如果您专门启动新线程,它们将没有上下文,因此您必须向它们提供对它们需要的任何数据的引用。

关于c# - LogicalCallContext 不在 HttpApplication BeginRequest 事件和请求的其余部分之间流动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com