异步Web处理程序在MVC中不起作用

时间:2016-04-27 13:46:29

标签: asp.net asp.net-mvc asynchronous async-await ashx

我尝试将自定义Web处理程序从Webforms项目迁移到MVC。它在那里运行良好并称为异步ProcessRequest。

public class MyHandler : IHttpHandler
{
    ...
    public async void ProcessRequest(HttpContext context)
    {
    ...

但是,当我在我的MVC项目(/Content/MyHandler.ashx)中运行它时,我收到以下错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async =“true”%>。此异常还可能表示尝试调用“异步void”方法,该方法通常在ASP.NET请求处理中不受支持。相反,异步方法应该返回一个Task,调用者应该等待它。

我尝试使ProcessRequest同步(我在方法定义中删除了“async”并将所有异步调用从await Method()更改为Method().Result,但它没有帮助,服务器只是永远加载页面。 我还尝试将IHttpHandler替换为IHttpAsyncHandler,但它无效。 我也试过在根目录和自定义文件夹中移动处理程序文件,结果是一样的。 请帮忙!

3 个答案:

答案 0 :(得分:3)

尝试使用抽象HttpTaskAsyncHandler类。

public class MyHandler : HttpTaskAsyncHandler
{
    public override async Task ProcessRequestAsync(HttpContext context)
    {

    }
}

答案 1 :(得分:0)

您可以尝试更改方法声明:

public async void ProcessRequest(HttpContext context)

public async Task ProcessRequest(HttpContext context)

答案 2 :(得分:0)

到目前为止,我已设法通过将ashx转换为常规Web表单(aspx)并将Async =" true"在Page指令中。 但是,如果仍然有webhandler的解决方案,我宁愿...

编辑: 毕竟,Kerim Emurla提出的解决方案部分工作,但我只需要改变一点: 公共覆盖异步任务ProcessRequestAsync