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

时间:2014-01-24 16:36:55

标签: c# .net iis

我正在尝试向.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?!
}

2 个答案:

答案 0 :(得分:3)

事件是一个接一个地处理的,如果任何事件以异步方式结束,则下一个事件将被放置在线程池的队列中,并在有线程空​​闲时进行处理。

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

这篇文章展示了事件之间线程切换的工作原理: http://forum.springframework.net/showthread.php?572-CallContext-vs-ThreadStatic-vs-HttpContext

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

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

答案 1 :(得分:0)

我无法重现您的问题,我正在使用.NET 4.5,MVC 4.数据显示来自“MyApp”(Global.asax)和HttpModule(我在尝试触发此操作时创建的)问题)。 它是一个干净的项目,只包含您提供的代码,还是其他一些干扰CallContext的东西? 是问题总是出现还是仅在重载下? (我甚至在Gatling身上摆弄了一下,但之后也没有任何问题)