【问题标题】:async action filter: Async & AuthorizeAttribute in ASP.NET WEB API异步操作过滤器:ASP.NET WEB API 中的 Async 和 AuthorizeAttribute
【发布时间】:2012-10-10 08:24:11
【问题描述】:

我在一个类中有我的身份验证逻辑,它派生自 System.Web.Http.AuthorizeAttribute(被覆盖的 OnAuthorization 方法)。我从该方法调用数据库,我希望该调用是异步的(幸运的是,新的 ADO.NET 异步 API 允许这样做)。

然后我将此属性应用到控制器,以使对其的所有调用都通过身份验证过滤器。到目前为止一切顺利。

但是这样做我遇到了以下问题。框架(ASP.NET Web API)似乎不知道我的意图是什么:)看起来它在我的过滤器的 OnAuthorizaion 方法完成(从异步调用返回)之前继续执行控制器的操作。因此来自框架的异常,例如“请求处理在所有未完成的异步操作完成之前完成..”

有没有开箱即用的方法来处理这个问题?

附:我的直觉说我正在创建自定义操作过滤器。然后我需要重写 ExecuteActionFilterAsync 并在那里进行身份验证,自己处理所有与任务相关的东西,而无需框架方面的帮助。)

【问题讨论】:

  • 框架为您提供的所有过滤器接口都是异步感知的。我假设您正在使用那些公开同步 API 的默认实现。按照以下答案的建议与IAuthorizationFilter 合作。

标签: asp.net-web-api async-await action-filter


【解决方案1】:

好的,这就是我想出的(在用反射器窥视引擎盖后):

public class SecurityFilterAttribute : FilterAttribute, IAuthorizationFilter
{
    public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    { 
        await OnAuthentication(actionContext);

        return actionContext.Response ?? await continuation();
    }

    private async Task OnAuthentication(HttpActionContext actionContext)
    {
         //some lengthy I/O operations (XXXAsync/await)
    }
}

这样,在应用到控制器/动作时,所有逻辑都将按正确的顺序执行,同时在 I/O 期间保持线程畅通。不过,对取消不是很尊重。但对我来说应该没问题..

无论如何,我真的很想知道是什么让 Web API 的创建者不走类似的道路......想法?

【讨论】:

    【解决方案2】:

    使用IAsyncAuthorizationFilter并异步实现接口。

    public async Task OnAuthorizationAsync(AuthorizationFilterContext actionContext)

    【讨论】:

    • 我相信这仅适用于 .NET Core。由于 OP 提到 System.Web.Http.AuthorizeAttribute 我猜他在谈论 Web API 或 MVC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多