情况:经典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进程一次处理一个。
正确答案:在IIS7中打开了服务器端调试。这使IIS进入单线程模式。
答案 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