加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 从Application_BeginRequest()中设置后,AsyncLocal值

发布时间:2020-12-15 19:52:33 所属栏目:asp.Net 来源:网络整理
导读:在以下示例中,我将一个值设置为AsyncLocal string在Application_BeginRequest()中我的HttpApplication子类(即Global.asax)上的变量: public class Global : System.Web.HttpApplication{ public static AsyncLocalstring AsyncLocalState = new AsyncLocals
在以下示例中,我将一个值设置为AsyncLocal< string>在Application_BeginRequest()中我的HttpApplication子类(即Global.asax)上的变量:
public class Global : System.Web.HttpApplication
{
    public static AsyncLocal<string> AsyncLocalState = new AsyncLocal<string>();

    protected void Application_BeginRequest(object sender,EventArgs e)
    {
        AsyncLocalState.Value = HttpContext.Current.Request.Path;
    }

    protected void Application_AuthenticateRequest(object sender,EventArgs e)
    {
        var path = AsyncLocalState.Value;
    }

    protected void Application_EndRequest(object sender,EventArgs e)
    {
        var path = AsyncLocalState.Value;
    }
}

稍后,我将尝试从处理程序(例如MVC操作方法)或甚至只是普通的IHttpHandler中访问此AsyncLocal变量的值.

如果我发送足够大的请求(例如,一个包含超过15KB数据的POST – 请求越大,就越容易观察到),当从处理程序访问时,AsyncLocalState的值很可能为NULL即使它是在BeginRequest上设置的.

这可以从一个全新的ASP.NET项目中重现,而不需要加载任何其他库/模块/处理程序.

这是一个错误吗?或者也许我做错了什么?或者ASP.NET太不稳定了吗?

附加说明:如果我改为使用CallContext.LogicalGetData / CallContext.LogicalSetData,则会观察到完全相同的行为.

平台:ASP.NET,.NET 4.6.2,在Windows 7上

更新:在尝试挖掘之后,我发现了很多引用,但没有任何权威性地说ExecutionContext不会在ASP.NET管道事件之间流动(除非它确实如此?). AsyncLocal和逻辑调用上下文都基于ExecutionContext.

解决方法

与权威答案最接近的是 this comment by David Fowl on GitHub.

如果这些事件不同步执行,则ExecutionContext不会在ASP.NET管道事件之间流动.因此,不要使用AsyncLocal或逻辑CallContext来持久化状态;使用HttpContext.Items.

更新:.NET 4.7.1添加了一个新的回调方法HttpApplication.OnExecuteRequestStep,每个文档“为ASP.NET管道提供了可扩展性,使开发人员可以轻松地在环境上下文场景中实现功能,并构建关心ASP的库. NET执行流程(例如,跟踪,分析,诊断和事务).“

这正是人们为了恢复ASP.NET管道事件之间的AsyncLocal状态或逻辑CallContext所需要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读