长期以来,我们一直在使用 CorrelationManager.ActivityId 来帮助关联多个线程的日志条目。我们在 SessionStart 上创建 ActivityId 并将其存储在会话中以用于所有后续请求。
protected void Session_Start(object sender, EventArgs e)
{
if (this.Session["ActivityId"] == null)
{
var activityId = Guid.NewGuid();
this.Session["ActivityId"] = activityId;
System.Diagnostics.Trace.CorrelationManager.ActivityId = activityId;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们从会话中重用它,如下所示:
protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
{
if (this.Session["ActivityId"] != null)
{
System.Diagnostics.Trace.CorrelationManager.ActivityId = (Guid)this.Session["ActivityId"];
}
else
{
var activityId = Guid.NewGuid();
this.Session["ActivityId"] = activityId;
System.Diagnostics.Trace.CorrelationManager.ActivityId = activityId;
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面已经完美地工作了很长时间。
但是,一旦我们将 Web 服务器升级到 .NET 4.5.2,我们就会随机为 ActivityId 记录空的 …