Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 异步httpmodulemvc_Asp.net Mvc_Async Await_Httpmodule - Fatal编程技术网

Asp.net mvc 异步httpmodulemvc

Asp.net mvc 异步httpmodulemvc,asp.net-mvc,async-await,httpmodule,Asp.net Mvc,Async Await,Httpmodule,我有一个同步HttpModule,其中包含以下代码。 // ///作为HTTP管道执行链中的第一个事件发生 ///当ASP.NET响应请求时。 /// ///事件的来源。 ///事件表明 ///包含事件数据。 私有异步void ContextBeginRequest(对象发送方,事件参数e) { HttpContext上下文=((HttpApplication)发送方).context; 等待此消息。ProcessImageAsync(上下文); } 当我尝试从一个空的MVC4应用程序(N

我有一个同步HttpModule,其中包含以下代码。

//
///作为HTTP管道执行链中的第一个事件发生
///当ASP.NET响应请求时。
/// 
///事件的来源。
///事件表明
///包含事件数据。
私有异步void ContextBeginRequest(对象发送方,事件参数e)
{
HttpContext上下文=((HttpApplication)发送方).context;
等待此消息。ProcessImageAsync(上下文);
}
当我尝试从一个空的MVC4应用程序(NET4.5)运行模块时,我得到以下错误

此时无法启动异步操作。异步的 操作只能在异步处理程序或 在页面生命周期中的某些事件期间。如果这 执行页面时发生异常,请确保该页面已关闭 标记的

我遗漏了一些东西,但从我的阅读来看,这个错误实际上不应该发生


我进行了深入研究,但似乎找不到任何帮助,有人有什么想法吗?

因此,同步HttpModule事件处理程序中有异步代码,ASP.NET抛出异常,指示异步操作只能在异步处理程序/模块中启动。对我来说似乎很简单

要解决此问题,您不应直接订阅
BeginRequest
;相反,创建一个
任务
——返回“handler”,将其包装并传递给

大概是这样的:

private async Task ContextBeginRequest(object sender, EventArgs e)
{
  HttpContext context = ((HttpApplication)sender).Context;
  await ProcessImageAsync(context);

  // Side note; if all you're doing is awaiting a single task at the end of an async method,
  //  then you can just remove the "async" and replace "await" with "return".
}
并认购:

var wrapper = new EventHandlerTaskAsyncHelper(ContextBeginRequest);
application.AddOnBeginRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);

这一定是你帮了我好几次了,谢谢!我应该说对不起,代码实际上是用NET4.0编写的,并且使用BCL库来支持async关键字,因此我可以同时支持4.0和4.5。因此,EventHandlerTaskAsyncHelper对我不可用。啊,不幸的是,
Microsoft.Bcl.Async
。在ASP.NET上,您必须在.NET4.5上运行,而不是.NET4.0.Ah。好的。。。因此,如果我从web.config中的
节点中删除
targetFramework=“4.5”
,就可以测试这一点。这是否意味着在Net4.0中,我的httpModule实际上不是异步的?这是否也意味着如果没有MVC的
EventHandlerTaskAsyncHelper
,我就不能使用异步httpModule,或者还有其他方法。老实说,这是一个错误,我还是有点困惑。消息似乎说httpModules是可以的。我相信您将“works”定义为“不抛出异常”。再看一看这篇博文:如果你在.NET4.0上编写ASP.NET,那么你不能使用
async
Microsoft.Bcl.async
不会逆转这一点)。ASP.NET的一些核心部分在.NET 4.5中被重写,以正确地支持
async
(尤其是
SynchronizationContext
),这在.NET 4.0中根本不可用。BCL提供了核心(.NET)行为,但ASP.NET有它自己需要的行为(而BCL不提供)。因此,
Microsoft.Bcl.Async
将为.NET 4.0桌面应用程序提供全面的
Async
支持,但不支持ASP.NET应用程序。如果需要同时支持这两种方法,那么编译时条件就是一种方法。
var wrapper = new EventHandlerTaskAsyncHelper(ContextBeginRequest);
application.AddOnBeginRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);