.NET Framework 4.0同端点并发请求问题:WebMethod为何串行执行?
并发请求串行处理的原因及解决思路
你代码里的[WebMethod(true)]是[WebMethod(EnableSession = true)]的简写,这就是导致50个并发请求被逐个处理的核心原因:
- ASP.NET对于启用Session的请求,会默认施加独占Session锁:只要是来自同一个Session的请求,ASP.NET会强制串行处理——第一个请求拿到锁后,后续同Session的请求必须等前一个请求完成释放锁才能执行。哪怕你的方法名带
Async,只要开启了Session支持,这个锁机制就会生效,直接阻断同Session的并发处理。 - 当然如果服务器的
maxConcurrentRequestsPerCPU等全局并发配置设得过低,也可能限制整体并发能力,但从你的场景来看,Session锁是最可能的诱因。
对应的解决方式
- 如果你的方法根本不需要访问Session,直接把
[WebMethod(true)]改成[WebMethod(false)],关闭Session支持,同客户端的并发请求就能被并行处理了。 - 如果确实需要读取Session数据(不需要写入),可以在类级别添加
[SessionState(SessionStateBehavior.ReadOnly)]特性,配合[WebMethod(EnableSession = true)]使用。只读Session会使用共享锁,允许同Session的多个只读请求并行执行。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

