IIS不会同时向同一客户端发送两个响应(仅适用于ASP)

dr.*_*vil 8 iis-6 http asp-classic

我有2个ASP页面.

我向Firefox的第一页请求(在服务器端需要30秒才能处理),在30秒执行期间,我从Firefox到第二页请求另一个请求(服务器端不到1秒) ),但它确实在31秒后出现.因为它等待第一次完成请求.

当我从Firefox请求第一页然后从IE请求第二页时,它就是即时的.

所以基本上ASP-IIS 6以某种方式将每个客户端限制为一次一个请求(长处理请求).我需要在我的.NET客户端应用程序中解决这个问题.

这在3个不同的系统中进行了测试.如果要测试,可以在最后尝试ASP脚本.

在长SQL执行中或仅在耗时的ASP操作中,此行为相同.

注意:

  • 这不是关于HTTP Keep Alive
  • 它不是关于持久连接限制(我们尝试使用Net.ServicePointManager.DefaultConnectionLimit在firefox和.NET中增加此限制)
  • 这与用户代理无关
  • 这在ASP.NET中不会发生,所以我认为它与ASP.dll有关
  • 我试图在客户端而不是服务器上解决这个问题.我没有直接控制服务器它是第三方解决方案.

有没有办法解决这个问题?

示例ASP代码:

第一个ASP:

<%
Set cnn = Server.CreateObject("Adodb.Connection")
cnn.Open "Provider=sqloledb;Data Source=.;Initial Catalog=master;User Id=sa;Password=;"
cnn.Execute("WAITFOR DELAY '0:0:30'")
cnn.Close
%>
Run Code Online (Sandbox Code Playgroud)

第二个ASP:

<%
Response.Write "bla bla"
%>
Run Code Online (Sandbox Code Playgroud)

Ant*_*nes 10

这是由于ASP管理Sessions的方式.Session对象是单线程的,因此一次只能由一个工作线程访问.当第二个请求到达的时间与现有线程已处理的相同会话时,该请求由ASP排队,直到会话对象可用.

即使您实际上没有在相关页面中使用会话对象,也会发生这种情况.

因此,当您从FF发出一个请求而另一个从IE发出请求时,您将有两个不同的会话,因此两个请求可以同时进行.你可以使用两个不同的IE实例获得相同的效果.

如果您知道永远不需要会话对象,则可以进入应用程序配置并将其关闭(这意味着没有ASP页面会触及会话对象).在这种情况下,ASP将允许同时处理来自同一浏览器实例的多个请求(因为它无法知道请求来自同一浏览器实例).

但是在大多数情况下,ASP代码对会话对象有一些用处(即使它只是标记了登录的会话).在这种情况下,除非将被调用的两个ASP页分隔为单独的应用程序,否则您将遇到此行为.

  • 您还可以使用此页面变量禁用每页会话:<%@ EnableSessionState = False%>在其他页面上创建的会话信息仍然存在,它只是ASP引擎,跳过仅使其可用于此页面的部分. (2认同)