C# LogicalCallContext不';HttpApplication BeginRequest事件与请求的其余部分之间是否存在t流?

C# LogicalCallContext不';HttpApplication BeginRequest事件与请求的其余部分之间是否存在t流?,c#,.net,iis,C#,.net,Iis,我试图向.NETMVC应用程序中的每个请求添加一些请求上下文信息。我使用LogicalCallContext实现此目的,因为我的请求有时会调用异步任务。但是,我发现在BeginRequest事件期间放在逻辑调用上下文中的项在管道中稍后的操作方法中不可用。有人能解释这种行为吗?我正在使用.NET4.5 下面是一些示例代码: public class MyApp : HttpApplication { public override void Init() { thi

我试图向.NETMVC应用程序中的每个请求添加一些请求上下文信息。我使用LogicalCallContext实现此目的,因为我的请求有时会调用异步任务。但是,我发现在BeginRequest事件期间放在逻辑调用上下文中的项在管道中稍后的操作方法中不可用。有人能解释这种行为吗?我正在使用.NET4.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
,但这是在处理每个事件时专门设置的,这意味着每个事件都有一个新的调用上下文

下面是一篇文章,展示了线程如何在事件之间切换:

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


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

我无法重现您的问题,我使用的是.NET 4.5、MVC 4。显示的数据来自“MyApp”(Global.asax)和HttpModule(我在试图触发此问题时创建的)。 它是一个干净的项目,只包含您提供的代码,还是可能是其他干扰CallContext的东西?
问题是否总是出现,还是仅在重载情况下出现?(我甚至对Gatling做了一些修改,但也没有任何问题)

为什么不使用HttpContext.Items来存储每个请求的数据?@SergeyLitvinov:因为HttpContext.Current不沿着逻辑执行流流动,所以它不能很好地处理多个线程。这就是我使用LogicalCallContext的原因(在ThreadPool.QueueUserWorkItem()中持续存在)调用、新线程、异步方法等。知道为什么它不能在这里持久存在吗?@ChaseMedallion:逻辑调用上下文最初用于远程调用。从我所看到的数据必须实现
iLogicThreadAffinative
接口才能传播到AppDomain之外,但我不知道这是否也适用于这里。链接是过时的,这是2014年的页面版本,我想你是对的。我对代码进行了一点重构,这个问题就消失了。我猜我的调用上下文操作代码中有一个bug已经消失了。谢谢你的确认!