我在类中有我的身份验证逻辑,派生自System.Web.Http.AuthorizeAttribute(重写的OnAuthorization方法)。我从该方法调用了一个数据库,我希望该调用是异步的(幸运的是,新的ADO.NET异步API允许这样做)。
然后我将此属性应用于控制器,以便通过身份验证过滤器对其进行所有调用。到目前为止一切都很好。
但这样做我遇到了以下问题。框架(ASP.NET Web API)似乎并不知道我的意图是什么:)看起来它在我的过滤器的OnAuthorizaion方法完成之前继续执行控制器的动作(从异步调用返回)。因此,框架中的异常a la“请求处理在所有未完成的异步操作完成之前完成..”
有没有开箱即用的方法来解决这个问题?
谢谢!
P.S。我的直觉是说我正在进行自定义动作过滤器创建。然后我需要覆盖ExecuteActionFilterAsync并在那里进行我的身份验证,在没有框架方面的帮助的情况下自己处理所有与任务相关的东西..)
答案 0 :(得分:6)
使用IAsyncAuthorizationFilter
并异步实现接口。
public async Task OnAuthorizationAsync(AuthorizationFilterContext actionContext)
答案 1 :(得分: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)
}
}
这样,当应用于控制器/动作时,所有逻辑将以适当的顺序执行,同时在I / O期间保持线程不被阻塞。但是,对取消不太尊重。但是我的目的应该没问题。
无论如何,我真的很想知道是什么让Web API创建者不会采用类似的方式......想法?