You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:35:23