是否可以在MVC 4 AuthorizeAttribute中使用async/await?

Eva*_*van 24 c# asp.net asp.net-mvc async-await asp.net-mvc-4

我看到MVC的暴露的唯一覆盖AuthorizeAttributepublic override void OnAuthorization( AuthorizationContext filterContext )这是不适合与异步使用/等待,因为它没有返回Task.是否有另一种方法来创建AuthorizeAttribute允许使用async/await的MVC?

Ste*_*ary 23

ASP.NET MVC今天不支持异步过滤器.请投票.

但是,本周在TechEd上宣布的ASP.NET"vNext"将支持MVC的异步过滤器.

  • 没有."等待"/"结果"会导致死锁; 当ASP.NET类型假定ASP.NET同步上下文时,嵌套的消息循环可能会失败; 推送到后台线程并等待丢失请求上下文.今天没有好的解决方案; 最干净的解决方案是使用同步API.:(如果您*必须*在过滤器中使用异步API,您只需找到一个适用于您的特定代码的解决方案. (4认同)

Eva*_*van 5

随着 asp.net core 的发布,Stephen Cleary 的回答是正确的,如果您正在运行最新的 asp.net core,这是理想的方法。

对于尚未更新的那些,我能够使用异步 HttpModule 解决我的问题,该模块通过HttpContext.Items. 我在这里添加了关于我的解决方案的更多细节 - http://evandontje.com/2017/08/15/solutions-for-async-await-in-mvc-action-filters/


mal*_*ess 5

对于那些还没有体验过 .NET Core 的人,您可以使用 ASP.NET Web API 2 中的此方法:

OnAuthorizationAsync 覆盖:

public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellation)
Run Code Online (Sandbox Code Playgroud)

例如,您可以像这样调用异步webapi 服务:

 public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellation)
    {
        await base.OnAuthorizationAsync(actionContext, cancellation);

        if (await IsUserAdminAsync()) /* call any async service */
            return;
        this.HandleUnauthorizedRequest(actionContext);
    }
Run Code Online (Sandbox Code Playgroud)