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

ASP.NET WebForm同浏览器同IP请求在IIS中排队问题及解决咨询

问题分析与解决方法

核心原因

你遇到的问题并非IIS线程配置不足导致,核心原因有两个:

  1. ASP.NET Session的独占锁机制:默认情况下,ASP.NET会对同一个Session的请求加独占锁,同Session的所有请求会被串行处理——这是同浏览器(共享Session)下B.aspx必须等待A.aspx完成的主要原因。
  2. 浏览器同域名并发连接限制:主流浏览器默认对同一域名仅允许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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:10:05