C# global.asax.cs授权webapi事件是否需要锁定?
我正在开发一个web api,每个请求都通过方法上的Authorize注释进行身份验证,即[Authorize roles=trader] 根据日志,我可以判断多个请求同时进入应用程序\u PostAcquireRequestState事件 当角色加载到Application_PostAcquireRequestState事件中时,可能会出现竞争条件,并且一些调用会随机失败 我不确定我是否在正确的轨道上。事件是应用程序级别和应用程序。Lock可能会修复此问题,并希望知道它是否是正确的解决方案。 我注意到有几个对web api的调用失败,它们是同时发起的 我感谢你的帮助 Global.ascs.csC# global.asax.cs授权webapi事件是否需要锁定?,c#,authentication,asp.net-web-api,authorization,global-asax,C#,Authentication,Asp.net Web Api,Authorization,Global Asax,我正在开发一个web api,每个请求都通过方法上的Authorize注释进行身份验证,即[Authorize roles=trader] 根据日志,我可以判断多个请求同时进入应用程序\u PostAcquireRequestState事件 当角色加载到Application_PostAcquireRequestState事件中时,可能会出现竞争条件,并且一些调用会随机失败 我不确定我是否在正确的轨道上。事件是应用程序级别和应用程序。Lock可能会修复此问题,并希望知道它是否是正确的解决方案。
protected void Application_PostAcquireRequestState()
{
//Application.Lock();
//get user roles and verify access...
...
//Application.Unlock();
}
控制器
[Authorize(Roles = "Trader")]
public async Task<IHttpActionResult> GetOrder(long id)
{
//get order
}
您错了,这个事件以及其他一些事件BeginRequest、AuthenticateRequest、AcquisiteRequestState等从技术上讲是一个应用程序级事件应用程序,但是,实际上它是一个请求级事件,同一处理程序的多个副本会针对不同的请求同时触发 这意味着处理程序的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将根据您在此处设置的授权和角色在管道中立即进行验证,我不确定您为什么要在此处验证访问。此WebAPI用于windows服务,它根据消息队列中的消息触发。注意,为每条消息调用web api。因为它是服务,所以在这种情况下用户是相同的,api可以在以后的应用程序中使用。不管你说什么,答案仍然有效。我明白你的意思,谢谢你的帮助。有多个同时调用此消息,可能存在竞争条件。这是应用程序级事件,若要同步调用,application.Lock可能会有所帮助。每个webapi请求都会引发该事件。调试很困难,因为只有约1%的调用失败。应该没有竞争条件。每个调用都有自己的上下文。用户,应该更新自己的副本。即使同时处理多个请求,它们也不会干扰。如果有什么不对劲,那就是你获得角色的方式,这才是你真正的问题所在。