asp.net – 从Application_BeginRequest()中设置后,AsyncLocal值
在以下示例中,我将一个值设置为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所需要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET MVC 3 – Ajax.BeginForm vs jQuery Form Plugin
- asp.net-mvc – ASP.NET MVC角色授权
- 如何避免ASP.NET中的快速页面刷新?
- ASP.Net MVC3 Razor Href错误
- 如何在ASP.NET MVC中获取相对路径
- asp.net – RadGrid在Visual Studio 2013中打开应用程序时,
- 在ASP.NET网站中使用单例连接是一个好主意
- ASP.NET POST-DATA截断为49152字节(48K)
- asp.net-mvc – 首先在MVC4数据库中更改数据库后刷新控制器
- asp.net – 如何在WebPage中显示嵌入的Excel文件?
- 我应采取哪些措施来保护我的多层ASP.NET应用程序
- asp.net – 使用jQuery调用MVC中的action方法,参
- asp.net-mvc – 如何在ASP.NET MVC中围绕AreaReg
- asp.net – 如何让gridview中的一列成为图像?
- entity-framework – 在MVC 5项目上使用ASP.NET
- asp.net-mvc – 返回局部视图的RedirectToAction
- asp.net – 使用WebMethods和session时的最佳实践
- asp.net-mvc – 出现在MVC4 Razor View中的奇怪的
- 深入理解C# 3.x的新特性(2):Extension Method
- 如何使用MSBuild发布Asp.NET Web应用程序?