异步操作过滤器:ASP.NET WEB API中的Async和AuthorizeAttribute

ay.*_*llo 12 action-filter async-await asp.net-web-api

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

然后我将此属性应用于控制器,以便通过身份验证过滤器对其进行所有调用.到现在为止还挺好.

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

是否有任何开箱即用的方式来处理?

谢谢!

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

Guo*_*ang 10

IAsyncAuthorizationFilter异步使用和实现接口。

public async Task OnAuthorizationAsync(AuthorizationFilterContext actionContext)

  • 我相信这仅适用于 .NET Core。由于 OP 提到了 System.Web.Http.AuthorizeAttribute,我猜他是在谈论 Web API 或 MVC。 (2认同)

ay.*_*llo 5

好的,这就是我想出来的东西(在用反射器瞥见引擎盖后):

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,当应用于控制器/动作时,所有逻辑将以适当的顺序执行,同时在I/O期间保持线程不被阻塞.但是,对取消不太尊重.但应该可以为我的目的..

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