IIS7 - 一次只能提供一页。这让我很难受!

时间:2009-02-25 19:20:15

标签: iis iis-7 asp-classic

情况:经典ASP应用程序,使用自定义应用程序池。默认设置。

部分 IIS7计算机上,IIS决定一次只提供一个页面。因此,如果从站点多次加载任何页面,则每个页面都必须连续加载。

e.g。如果我从一个浏览器加载http://foo.com/default.asp,并从我加载http://foo.com/differenturl.asp的另一台机器加载,则第一个必须在另一个加载之前完成。这几乎就像w3p进程是单线程的。

请注意,IIS的高级设置中有一个名为MaxProcesses的设置,其中显示“将此设置为大于1以创建Web Garden”(无论是什么)。这不能解决问题,因为这会产生具有自己的会话状态等的多个进程,并且当您加载http://foo.com/default.asp时,无法保证您被分配到同一进程。

问题出现了,因为我们有一个用ASP编写的诊断页面,它创建了一个ActiveX控件,它在网站上加载了一个url并返回结果。

因此,diagnostics.asp加载并在服务器端的代码中创建一个小型Web控件,在同一服务器上加载(想想XMLHTTP控件)default.asp。

此页面永远不会完成加载,因为服务器在提供default.asp页面之前正在等待diagnostics.asp页面完成。死锁!

这在每台IIS6计算机上运行良好,我相信有一些IIS7服务器可以正常工作。

我已经证实这不是我们古怪诊断的结果。从一台计算机或甚至单独的计算机上加载多个选项卡将显示Web进程一次处理一个。


AnthonyWJones的

正确答案:在IIS7中打开了服务器端调试。这使IIS进入单线程模式。

8 个答案:

答案 0 :(得分:29)

在IIS管理器中,单击树中的应用程序。

双击IIS部分下的ASP。

展开“调试属性”

确保“启用客户端调试”和“启用服务器端调试”都设置为false。

启用调试时,ASP仅限于以单线程方式一次处理一个请求。

答案 1 :(得分:4)

首先:确保您使用多个客户端进行测试。一台计算机只能同时向同一台服务器(IP地址)发出2个HTTP请求。 (这是一个RFC指示。)

如果这不能解决您的问题,请查看IIS7 - > ASP - >服务 - > COM Plus属性 - >在MTA中执行。尝试将此设置设置为“True”。

希望这有帮助。

答案 2 :(得分:2)

您确定您的代码中没有导致死锁的依赖项吗?我之前看到过这种情况,其中日志记录,SQL连接等会创建依赖项。使用perfmon并检查硬盘读/写队列,内存读/写队列以查看是否有备份。

我强烈建议Tess Ferrandez's (ASP.NET Escalation Engineer - Microsoft)博客提供很多见解和方法,以了解正在发生的事情。苔丝已经忘记了比大多数人都知道的更多的东西。

我认为您的问题不是IIS相关的,而是您的应用中的某些内容,可能在您的ActiveX组件中。确保在ActiveX组件之后进行清理。这是我使用Excel(另一个Com组件)后清理的一段代码。记住Com不受管理。

    Private Sub ShutDownExcel()
    If objExcel IsNot Nothing Then
        objExcel.DisplayAlerts = True
        objExcel.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel)
        objExcel = Nothing
    End If

    ' Clean up memory so Excel can shut down. 
    GC.Collect()
    GC.WaitForPendingFinalizers()

    ' The GC needs to be called twice in order to get the 
    ' Finalizers called - the first time in, it simply makes 
    ' a list of what is to be finalized, the second time in, 
    ' it actually the finalizing. Only then will the 
    ' object do its automatic ReleaseComObject. 
    GC.Collect()
    GC.WaitForPendingFinalizers()
End Sub

希望这有帮助。

答案 3 :(得分:0)

IIS7最多是多线程的,因此我猜您的应用程序存在问题。

您提到ActiveX从同一服务器加载页面 - 也许这个ActiveX不是免费的线程,这会导致每个使用它的页面运行单个实例?

BTW:Web Garden - 使用多个进程的同一服务器 - 无法使用进程内会话 Web Farm - 多个Web服务器

答案 4 :(得分:0)

确保asp.net配置为使用多个工作线程。 This msdn article说明了如何设置此配置选项。

答案 5 :(得分:0)

您是否已将“应用程序池”上的“托管管道模式”更改为“经典”(默认为“集成”)?如果没有,请尝试使用经典。

我不知道它是否有任何帮助。我很久以前就不再努力让经典的ASP应用程序与IIS7一起使用。 (不是我可以说,这些应用程序真的很好而且正确,但它们在早期版本中有效。)

尝试关闭测试页面的缓冲并让它们在每次迭代中吐出一些东西。 IIS7中的缓冲(和缓存)可能已经改变。也许它们会被同时处理,而缓冲区太大而无法看出差异。

这就是我现在想到的一切。


我假设您正在使用非常简单的案例进行测试。你的应用程序没有(测试页面和global.asa都没有)使用两个请求共有的奇怪对象,因此需要锁定。

答案 6 :(得分:0)

只是想一想,但如果你去IIS的网站,点击左侧的限制... 链接,设置的连接限制是什么?那里有最大带宽和最大并发连接选项。

我还会转到应用程序池并单击高级设置... 并检查CPU和内存限制。甚至可能从头开始创建一个新的应用程序池,并选择 No Managed Code 来消除它。

答案 7 :(得分:0)

如果调试设置不是问题,我发现在IIS 8中使用ASP时会遇到类似的行为。

我不知道这是IIS 8特定的,但是" ASP保证会话中只有一个请求会随时执行。" http://msdn.microsoft.com/en-us/library/ms972335.aspx