我正在开发一个web api,每个请求都通过授权注释方法进行身份验证,即[授权(角色="交易者")]
根据日志我可以告诉多个请求同时进入Application_PostAcquireRequestState事件。
当在Application_PostAcquireRequestState事件中加载角色时,可能存在竞争条件,并且某些调用会随机失败。
我不确定自己是否走上正轨。该事件是应用程序级别,Application.Lock()可以解决问题,并想知道它是否是正确的解决方案。 我注意到几次对web api的调用失败,这些调用同时发生。
感谢您的帮助。
Global.ascs.cs
protected void Application_PostAcquireRequestState()
{
//Application.Lock();
//get user roles and verify access...
...
//Application.Unlock();
}
controller.cs
[Authorize(Roles = "Trader")]
public async Task<IHttpActionResult> GetOrder(long id)
{
//get order
}
答案 0 :(得分:1)
你错了,这个事件,以及其他一些事件(BeginRequest,AuthenticateRequest,AcquireRequestState等)在技术上是一个应用程序级事件(Application_...
),但实际上它是一个请求级别对于不同的请求,会同时触发事件和同一处理程序的多个副本。
这意味着处理程序的sender
参数为您提供了精确的执行上下文,并且可以像
protected void Application_PostAcquireRequestState( object sender, EventArgs e )
{
HttpApplication app = (HttpApplication)sender;
HttpContext ctx = app.Context; // current context
// with the current context in hand you can pretty much access anything
// including the Request, Response and last but not least, User
}
无需锁定或任何其他节流方式。
我只是不确定为什么你会在这里验证访问权限,考虑到MVC / WebAPI将在管道中根据你放在Authorize
和角色的那一刻进行访问。