asp.net-web-api - 异步 WebApi ActionFilterAttribute。异步模块或处理程序已完成,而异步操作仍处于挂起状态

标签 asp.net-web-api async-await actionfilterattribute

我了解 await 等待任务(可等待)完成。
但我对这实际上意味着什么感到困惑。

的代码不 工作:

public async override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    if (actionExecutedContext.Response.Content != null)
    {
        var responseContent = await actionExecutedContext.Response.Content.ReadAsStringAsync();
        DoSomething(responseContent);
    }
}

的代码工作:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    if (actionExecutedContext.Response.Content != null)
    {
        var responseContent = actionExecutedContext.Response.Content.ReadAsStringAsync().ContinueWith(
        task =>
        {
            DoSomething(task.Result);
        });
    }
}

显然错误信息异步模块或处理程序已完成,而异步操作仍处于挂起状态。 告诉我没有等待异步调用完成,而是“主”线程继续。我希望线程继续,但不在当前方法中。我认为线程将返回到 asp.net 堆栈做一些其他工作,并在等待 asyncOperation() 操作完成后返回。

我也在其他地方使用 await - (例如等待 Web 服务响应) - 我在任何地方都没有遇到类似的问题。我想知道为什么 IActionFilterAttribute 行为不同。事实上,我的 Web 服务调用可能比将响应内容读入字符串花费的时间更长。

有人可以启发我吗?我感觉我没有理解这个概念。

最佳答案

而不是实现

public async override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)

你必须实现 OnActionExecuted 的异步版本方法如下:
public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)

这样您就可以在方法中使用 await 并且行为将如您所料。

希望这可以帮助。

关于asp.net-web-api - 异步 WebApi ActionFilterAttribute。异步模块或处理程序已完成,而异步操作仍处于挂起状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502983/

相关文章:

asp.net-mvc-4 - Action Filter 不在 Web 应用程序中执行,而是在 Web Api 中执行

c# - 在路由匹配发生之前拦截所有 WebApi 调用

javascript - 等待 JavaScript 中的获取结果

c# - ActionFilterAttribute 中的 GetService 返回 null

c# - 如何在 Tag Helper 的 ASP.NET Core ProcessAsync 中强制更改线程

javascript - Meteor:如何调用带有2个参数的函数并等待结果

asp.net-mvc - ActionFilterAttribute mvc 需要调用一次

json - 尝试解析 WebAPI 中的 ReadAsFormDataAsync 结果时没有 MediaTypeFormatter 错误

c# - 删除 xmlns :i and xmlns from webapi

c#-4.0 - 如何在asp.net web api中使用接收POST数据?