Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# global.asax.cs授权webapi事件是否需要锁定?_C#_Authentication_Asp.net Web Api_Authorization_Global Asax - Fatal编程技术网

C# global.asax.cs授权webapi事件是否需要锁定?

C# 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可能会修复此问题,并希望知道它是否是正确的解决方案。

我正在开发一个web api,每个请求都通过方法上的Authorize注释进行身份验证,即[Authorize roles=trader]

根据日志,我可以判断多个请求同时进入应用程序\u PostAcquireRequestState事件

当角色加载到Application_PostAcquireRequestState事件中时,可能会出现竞争条件,并且一些调用会随机失败

我不确定我是否在正确的轨道上。事件是应用程序级别和应用程序。Lock可能会修复此问题,并希望知道它是否是正确的解决方案。 我注意到有几个对web api的调用失败,它们是同时发起的

我感谢你的帮助

Global.ascs.cs

 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%的调用失败。应该没有竞争条件。每个调用都有自己的上下文。用户,应该更新自己的副本。即使同时处理多个请求,它们也不会干扰。如果有什么不对劲,那就是你获得角色的方式,这才是你真正的问题所在。