如何在同一网站的ashx和aspx文件中使用await/async?

4
我正在尝试在aspx页面的代码后台运行异步任务。我使用Page.RegisterAsyncTaskPage.ExecuteRegisteredAsyncTasks来运行异步方法。
然而,我收到错误提示说需要在webconfig文件中添加<httpRuntime targetFramework="4.5" />,但是添加该行后,我的ashx页面中的异步/等待开始抛出错误。

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

在添加了<httpRuntime targetFramework="4.5" />之前,ashx页面中的异步/等待正常工作。那么我该如何让异步/等待在两种类型的文件中都正常工作?

与您的ashx文件关联的类继承自哪个类? :HttpTaskAsyncHandler 还是 :IHttpAsyncHandler 还是 :IHttpHandler? - Buh Buh
IHttpHandler. awaitprocessRequest 方法内部。它使用了一个可等待的库方法。处理程序本身没有被任何东西等待。 - uhsl_m
HttpTaskAsyncHandler 替换 IHttpHandler 就解决了。 - uhsl_m
很棒,它对你起作用了。就我所知,现在我已经将其完整地回答了。 - Buh Buh
1个回答

21

现在创建ashx文件时,您可能希望它们默认为异步。 框架通过使用新的HttpTaskAsyncHandler来支持此功能。

只需从HttpTaskAsyncHandler继承,而不是IHttpHandler

然后删除该方法:

public ProcessRequest(HttpContext context)

并将其代码移动到内部

public override async Task ProcessRequestAsync(HttpContext context)

您可以利用任务的优势


1
非常感谢您的解决方案 :) - Osama khodroj
如果一个 ashx 派生自 HttpTaskAsyncHandler,那么调用它的旧客户端是否仍然可以不改变地正常工作?还是客户端需要使用 UploadStringAsync? - Terry
@Terry,抱歉,这已经是几年前你提出的问题了:( 遗留客户端将继续以同样的方式工作。他们通过HTTP请求文件,因此不知道.ashx文件的内部情况。此外,客户端可能是浏览器、JavaScript或其他 .NET客户端,因此UploadStringAsync肯定不是必需的。 - Buh Buh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接