【问题标题】:Async Web handler not working in MVC异步 Web 处理程序在 MVC 中不起作用
【发布时间】:2016-08-21 20:42:45
【问题描述】:

我尝试将自定义 Web 处理程序从 Webforms 项目迁移到 MVC。它在那里运行良好并调用了 async ProcessRequest。

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

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

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

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

【问题讨论】:

  • 您考虑过只使用控制器吗?对我来说似乎更简单..
  • 不,因为它对我来说似乎更简单,我想使用我已经拥有的解决方案(请注意,它是一个相对较大的处理程序)

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


【解决方案1】:

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

public async void ProcessRequest(HttpContext context)

public async Task ProcessRequest(HttpContext context)

【讨论】:

  • 'MyHandler' 没有实现接口成员'IHttpHandler.ProcessRequest(HttpContext)'。 “MyHandler.ProcessRequest(HttpContext)”无法实现“IHttpHandler.ProcessRequest(HttpContext)”,因为它没有匹配的返回类型“void”。
  • 你很接近,请参阅上面的解决方案。
  • 是的。 “覆盖”是一个不同的故事,因为编译器无论如何都会抱怨,这应该是一个容易解决的问题。太好了,您能够解决它!
【解决方案2】:

尝试使用抽象 HttpTaskAsyncHandler 类。

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

    }
}

【讨论】:

  • 是的,我之前尝试过,但我收到错误“并非所有代码路径都返回值”,因为我使用了“return;”打破。
  • 您的解决方案(几乎)有效,我只需要将方法更改为 public override async Task ProcessRequestAsync
  • 我很高兴它对你有用,让我编辑我的答案,以免其他人感到困惑。
  • 这是一个很好的解决方案,只需要指出使用此解决方案需要 .NET 4.5 的先决条件。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多