asp.net – 从Application_BeginRequest()中设置后,AsyncLocal值为Null
|
在以下示例中,我将一个值设置为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 – ASP MVC – 有默认内容类型的任何常量?
- ASP.NET和System.Diagnostics跟踪 – 我错过了什么,或者这是
- asp.net-mvc – mvc4数据注释比较两个日期
- asp.net – 使用Visual Studio 2017在.NET Core解决方案上没
- asp.net-mvc – WebForms和MVC可以存在于一个项目中吗?
- asp.net-mvc – 为什么ASP.NET MVC忽略了我的尾随斜杠?
- IIS7上的ASP.NET应用程序 – 在iisreset启动后非常慢
- asp.net – IIS 7.5 Web应用程序首先请求应用程序池回收非常
- ASP.NET SQL成员资格表
- asp.net-mvc – 我如何可以渲染局部视图在asp.net mvc 3
- asp.net-mvc-3 – 带有asp.net mvc 3的$ajax内的
- asp.net-mvc-3 – 将nhibernate实体序列化为json
- asp.net-mvc – 从MVC中的控制器确定部分视图的模
- 如何在ASP.NET页面上使用框架?
- asp.net – UserControl Viewstate在回发后丢失所
- asp.net-mvc – 避免在Web Publish上删除文件夹
- asp.net-core – CoreCLR中的哈希算法
- asp.net-mvc – 使用FileResult返回压缩文件的AS
- asp.net-mvc-3 – MVC直接在单个对象上调用模型绑
- asp.net – 与Entity Framework中的联结表有多对
