IIS7 - 一次只提供一页。这让我发疯!
Posted
技术标签:
【中文标题】IIS7 - 一次只提供一页。这让我发疯!【英文标题】:IIS7 - only serves up one page at a time. It's a making me crAzY! 【发布时间】:2009-02-25 19:20:15 【问题描述】:情况:经典 ASP 应用程序,使用自定义应用程序池。默认设置。
在一些 IIS7 机器上,IIS 决定一次只提供一个页面。因此,如果多个从一个站点加载任何页面,每个页面都必须连续加载。
例如如果我从一个浏览器加载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 进程一次处理一个。
正确答案 by AnthonyWJones:在 IIS7 中打开了服务器端调试。这会将 IIS 置于单线程模式。
【问题讨论】:
交叉张贴在这里forums.iis.net/p/1155632/1894991.aspx#1894991 您能写出所选答案的哪一部分有帮助吗?问题背后的原因是什么? 我会知道的。我还不知道,因为我无法在我的机器上进行复制,只有一位客户(他正在度假)。 好的。既然你已经标记了答案,我认为你已经解决了。当你这样做时,请分享......我只是好奇。正如我所说,我自己在 IIS7 上运行一些旧的 ASP 代码时遇到了问题(会话、负载平衡、身份验证,所有这些都变得疯狂)。希望我可以用 ASP.NET 重写它。 我没有标记答案,*** 标记了答案,因为我在问题上放了一个赏金,它会自动选择一个答案。我怀疑 IIS 处于调试模式,运行单线程也是如此。 【参考方案1】:在 IIS 管理器中单击树中的应用程序。
双击 IIS 部分下的 ASP。
展开“调试属性”
确保“启用客户端调试”和“启用服务器端调试”都设置为 false。
启用调试后,ASP 仅限于以单线程方式一次处理一个请求。
【讨论】:
我修正了投票。我无法修复已接受的答案,因为我无法验证赏金何时过期:( @Michael:感谢您对投票的认可。我认识到像你这样的人有自己的生活,因此比像我们中的一些人那样一直跟踪 SO 发生的事情要好得多首先:确保使用多个客户端对此进行测试。一台计算机同时向同一服务器(IP 地址)发出 2 个 HTTP 请求。 (这是一个 RFC 规范。)
如果这不能解决您的问题,请查看 IIS7 -> ASP -> 服务 -> COM Plus 属性 -> 在 MTA 中执行。尝试将此设置设置为“真”。
希望这会有所帮助。
【讨论】:
单个客户端,而不是单个计算机。此外,一些客户完全无视这一点。 IIS7 中的 asp/comPlus/executeInMTA 属性与 IIS6 中的 AspExecuteInMTA 相同。默认为 0。如果在 IIS6 中没有设置为 1,那么在 7 中可能无济于事。无论如何,应该小心这个设置,因为某些 COM 对象在多线程环境中可能会出现异常。 确实,某些 COM+ 组件在不是为多线程环境设计时可能会出现异常行为。不过,您的 ASP 页面可能只是“挂”在这个问题上,所以尝试一下可能不会有什么坏处。 @FlySwat:是的,我知道是这种情况,但我不确定 IIS7 是否在服务器端强制执行此操作(即每个客户端 IP 地址。)同时获得 2 个连接很容易在单个 HTTP 页面(例如图像)上,因此从 2 台物理 PC 进行检查永远不会受到伤害。 如果 IIS7 仅基于客户端 IP 强制执行此操作,那么如果多个用户在 NAT/防火墙之类的东西后面访问它就不是很好了。听起来不太可能,但我知道什么。【参考方案3】:您确定您的代码中没有导致死锁的依赖项。我之前在日志记录、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
希望这会有所帮助。
【讨论】:
【参考方案4】:IIS7 肯定是多线程的,所以我猜你的应用程序有问题。
您提到 ActiveX 从同一服务器加载页面 - 也许这个 ActiveX 不是免费线程的,这导致使用它的每个页面都运行单个实例?
顺便说一句:Web Garden - 使用多个进程的同一服务器 - 不能使用进程内会话 网络农场 - 多个网络服务器
【讨论】:
当您制作两个带有循环的asp页面时问题仍然存在(因此它们会执行一段时间)。 IIS7 在第一页完成之前不会显示第二页,所以这不是应用程序的问题。 这并不能排除它是应用程序的问题,它更有可能是应用程序的问题。您是否尝试过同时手动点击两个网址?【参考方案5】:确保将 asp.net 配置为使用超过 1 个工作线程。 This msdn article 解释了如何设置这个配置选项。
【讨论】:
【参考方案6】:只是一个想法,但是如果您在 IIS 中访问该网站,单击左侧的 Limits... 链接,连接限制设置为多少?那里有最大带宽和最大并发连接数选项。
我还会去应用程序池并单击 高级设置... 并检查 CPU 和内存限制。甚至可能从头开始创建一个新的应用程序池,并选择 No Managed Code 来消除它。
【讨论】:
【参考方案7】:您是否已将应用程序池上的“托管流水线模式”更改为“经典”(默认为“集成”)?如果没有,请尝试使用经典。
我不知道这是否会有所帮助。我很久以前就不再为让经典的 ASP 应用程序与 IIS7 一起工作而奋斗了。 (我不能说,这些应用程序确实不错且正确,但它们在早期版本中也能正常工作。)
并尝试关闭测试页面的缓冲,并让它们在每次迭代中吐出一些东西。缓冲(和缓存)在 IIS7 中可能已经改变。也许它们毕竟是同时处理的,只是缓冲区太大而看不出区别。
这就是我现在想到的。
我假设您正在使用非常简单的案例进行测试。您的应用(无论是测试页面还是 global.asa)都没有使用任何两个请求共有的奇怪对象,因此需要锁定。
【讨论】:
我尝试了集成/经典设置。那个没有骰子。【参考方案8】:如果调试设置没有问题,我发现您在 IIS 8 中使用 ASP 中的会话变量时会遇到类似的行为。
我不知道这是 IIS 8 特定的,但“ASP 保证任何时候都只会执行来自 Session 的一个请求。” http://msdn.microsoft.com/en-us/library/ms972335.aspx
【讨论】:
以上是关于IIS7 - 一次只提供一页。这让我发疯!的主要内容,如果未能解决你的问题,请参考以下文章
Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯
iPhone - 需要一些关于 EXC_BAD_ACCESS 的帮助,这让我发疯(包括完整的源代码)
基本的 jQuery slideUp 和 slideDown 让我发疯!