我尝试将自定义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
,但它无效。
我也试过在根目录和自定义文件夹中移动处理程序文件,结果是一样的。
请帮忙!
答案 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