为何ASP.NET Web Api基础认证请求无法被并发处理?
解决ASP.NET Web API基础认证下并发请求串行的问题
嗨,这个问题我之前也碰到过!核心原因其实是ASP.NET的Session机制在搞鬼——哪怕你没主动用Session,只要用了[Authorize]属性(尤其是基于Windows域角色的认证),ASP.NET默认会给同一用户的请求加上排他锁,导致它们只能串行处理,这就是为什么5次各5秒的请求总耗时变成了25秒。
下面给你几个具体的解决办法:
1. 直接禁用Web API的Session支持
这是最直接有效的方案,因为Web API本身就是为无状态设计的,完全不需要Session。
方法一:在控制器上标记禁用Session
在你的API控制器类顶部加上[SessionState]属性:
[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)] [System.Web.Http.Authorize(Roles = @"domain\group")] public class YourApiController : ApiController { [System.Web.Http.HttpGet] public string Test() { var startTime = DateTime.Now; System.Threading.Thread.Sleep(5000); var endTime = DateTime.Now; return $"Started at {startTime}, ended at {endTime}"; } }
方法二:全局配置禁用API路径的Session
如果有多个API控制器,在Global.asax里添加Application_PostAuthorizeRequest方法,对所有~/api开头的请求禁用Session:
protected void Application_PostAuthorizeRequest() { if (HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith("~/api")) { HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Disabled); } }
2. 排查其他可能的阻塞因素
如果禁用Session后还是串行,那得检查下有没有其他问题:
- 有没有在代码里用了静态变量或者全局锁?比如静态的业务逻辑对象,导致请求互相阻塞
- 有没有自定义认证过滤器?如果过滤器里有同步锁逻辑,也会导致串行
验证效果
修改完之后再测试5次并发请求,正常情况下总耗时应该接近5秒,而不是累加的25秒——因为每个请求都会在独立的线程里处理了。
内容的提问来源于stack exchange,提问作者Miroslav Adamec
相关产品推荐
相关产品推荐

