iis 7-一次只提供一页,这是一个让我疯狂!

ubbxdtey  于 2023-10-19  发布在  其他
关注(0)|答案(8)|浏览(140)

场景:经典ASP应用程序,使用自定义应用程序池。默认设置.
在 * 某些 * IIS 7机器上,IIS决定一次只服务一个页面。因此,如果多个加载任何网页从一个网站,每一个都必须连续加载。
例如,如果我从一个浏览器加载http://foo.com/default.asp,从另一台机器加载http://foo.com/differenturl.asp,第一台必须在另一台加载之前完成。这几乎就像w3 p进程是单线程的。
请注意,在IIS的高级设置中有一个名为MaxProcesses的设置,它说“将此设置设置为大于1以创建Web Garden”(不管它是什么)。这并不能解决问题,因为这会产生多个具有自己会话状态等的进程,当你加载http://foo.com/default.asp时,没有办法保证你被分配到同一个进程。
这个问题暴露了自己,因为我们有一个诊断页面,它是用ASP编写的,它创建了一个ActiveX控件,可以在网站上加载一个URL并返回结果。
因此,diagnostics.asp加载并在服务器端的代码中创建一个小的Web控件,该控件在同一服务器上加载(想想XMLHTTP控件)default.asp。
此页永远不会完成加载,因为服务器正在等待diagnostics.asp页完成,然后才提供default.asp页。僵持!
这在每台IIS 6机器上都能正常工作,我相信有些IIS 7服务器也能正常工作。
我已经证实这也不是我们古怪诊断的结果。从一台机器加载多个选项卡,甚至是从不同的机器加载多个选项卡将表明Web进程一次处理一个选项卡。

正确答案由安东尼·琼斯:在IIS 7中打开了服务器端调试。这会使IIS进入单线程模式。

esyap4oy

esyap4oy1#

在IIS管理器中,单击树中的应用程序。
双击IIS部分下的ASP。
展开“搜索属性”
确保“启用客户端调试”和“启用服务器端调试”都设置为false。
启用调试时,ASP仅限于以单线程方式一次处理一个请求。

pgx2nnw8

pgx2nnw82#

首先:确保你用多个客户端测试这个。一台计算机在同一时间只向同一服务器(IP地址)发出2个HTTP请求。(这是一个RFC规范。)
如果这不能解决您的问题,请查看IIS 7-> ASP -> Services -> COM Plus Properties -> Execute in MTA。尝试将此设置设置为“True”。
希望这对你有帮助。

rseugnpd

rseugnpd3#

你确定你的代码中没有导致死锁的依赖项吗?我以前见过这种情况,日志记录,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

希望这对你有帮助。

ldxq2e6h

ldxq2e6h4#

您是否已将应用程序池上的“托管管道模式”更改为“经典”(默认值为“集成”)?如果没有,试试经典。
我不知道这是否会有任何帮助。我很久以前就停止了争取让经典的ASP应用程序与IIS 7一起工作。(我不能说,这些应用程序真的很好很正确,但它们在早期版本中是有效的。
试着关闭测试页面的缓冲,让它们在每次迭代中吐出一些东西。缓冲(和缓存)可能在IIS 7中发生了变化。也许它们毕竟是并发处理的,只是缓冲区太大,看不出区别。
我现在只想到这个
我想你是在用非常简单的案例进行测试。您的应用程序不会(测试页面和阿萨)使用任何两个请求共有的奇怪对象,因此需要锁定。

j8ag8udp

j8ag8udp5#

IIS 7是最多线程的,所以我猜你的应用程序有问题。
你提到ActiveX从同一个服务器加载一个页面-也许这个ActiveX不是自由线程,这导致每个页面使用它运行单个示例?
顺便说一句:Web Garden -同一服务器使用多个进程-无法使用进程内会话Web Farm -多个Web服务器

68bkxrlz

68bkxrlz6#

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

wsewodh2

wsewodh27#

只是一个想法,但如果你去网站在IIS中,点击 * 限制. * 链接在左边,什么是连接限制设置?这里有最大带宽和最大并发连接选项。
我也会去应用程序池,点击 * 高级设置. *,并检查CPU和内存限制。甚至可能从头开始创建一个新的应用程序池,并选择“无托管代码”来消除它。

bjp0bcyl

bjp0bcyl8#

如果这不是调试设置的问题,我发现在IIS 8中使用ASP中的会话变量时,您可能会遇到类似的行为。
我不知道这是不是IIS 8特有的,但是“ASP保证在任何时候只有一个来自Session的请求会被执行。”http://msdn.microsoft.com/en-us/library/ms972335.aspx

相关问题