ASP.NET WebForm同浏览器同IP请求在IIS中排队问题及解决咨询
问题分析与解决方法
核心原因
你遇到的问题并非IIS线程配置不足导致,核心原因有两个:
- ASP.NET Session的独占锁机制:默认情况下,ASP.NET会对同一个Session的请求加独占锁,同Session的所有请求会被串行处理——这是同浏览器(共享Session)下B.aspx必须等待A.aspx完成的主要原因。
- 浏览器同域名并发连接限制:主流浏览器默认对同一域名仅允许2-6个并发连接,当A.aspx的请求占用连接后,同浏览器的B.aspx请求会被浏览器自身排队,直到连接释放。
具体解决步骤
一、解除Session串行限制(优先修复)
如果页面不需要Session或仅需读取Session,可通过以下方式解除锁定:
- 禁用页面Session:在A.aspx和B.aspx的页面指令中添加
EnableSessionState="False":
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="A.aspx.cs" Inherits="YourApp.A" EnableSessionState="False" %>
- 设置Session为只读模式:若仅需读取Session数据,添加
EnableSessionState="ReadOnly":
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="A.aspx.cs" Inherits="YourApp.A" EnableSessionState="ReadOnly" %>
只读模式下ASP.NET不会加独占锁,允许多个同Session请求并行处理。
二、异步化耗时操作,释放服务器线程
将同步阻塞的Thread.Sleep改为异步操作,避免长时间占用IIS工作线程:
修改A.aspx后台代码为异步:
protected async void Page_Load(object sender, EventArgs e) { if (IsPostBack) { // 异步等待替代同步Sleep,释放线程处理其他请求 await Task.Delay(TimeSpan.FromSeconds(30)); } }
同时需在页面指令中开启异步支持:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="A.aspx.cs" Inherits="YourApp.A" Async="true" %>
三、突破浏览器并发连接限制
- 启用HTTP/2:HTTP/2支持多路复用,同一域名下可同时发送多个请求。需在IIS 10及以上版本启用,且网站配置HTTPS(多数浏览器仅在HTTPS下支持HTTP/2)。
- 多子域名部署:将A.aspx和B.aspx分别部署到不同子域名(如
a.example.com和b.example.com),浏览器会将其视为不同域名,独立计算并发连接数。
四、补充检查IIS配置
- 应用程序池工作进程数:若使用单进程,Session锁仍会导致串行;若开启多进程(Web Garden),需注意InProc模式下Session无法跨进程共享,需改用StateServer或SQL Server存储Session。
- 线程池设置:默认线程池配置通常足够,异步化操作比单纯增加线程数更高效。
内容的提问来源于stack exchange,提问作者Robin Sun
相关产品推荐
相关产品推荐

