5

我有一个在 Windows Server 2008 R2 Standard 的 IIS 7 上运行的经典 ASP 应用程序。

它在一天中的某个时候工作正常,突然,在没有任何代码更改的情况下,它在实例化 COM+ 组件时开始抛出以下错误:

MyObject = Server.CreateObject("MyCustomComponent.MyCustomObject")

服务器对象错误“ASP 0177:80004005”

Server.CreateObject 失败

/path/script.asp,第 xx 行

80004005

可能是什么问题呢?我进行了互联网搜索,发现了几十个可能的答案,但似乎都与问题无关。我知道我使用了正确的对象名称——它在不久前还在工作。什么也没有变!我花了将近 2 个小时试图弄清楚这一点,但结果却是空的。

4

1 回答 1

11

错误 80004005 的一般故障排除

鉴于导致此错误的潜在原因种类繁多,可能很难解决此错误。快速的互联网搜索显示了大量的建议。

将可能的问题缩小到合理列表的关键方面是代码正在工作,但突然开始失败,没有任何代码更改。假设没有重大的 IIS 或 COM 配置更改,这排除了以下可能性,例如,为组件使用了错误的类名,或组件未正确注册。相反,必须将注意力转向 IIS 和 COM 本身的某些配置,这些配置可能会导致不一致的行为,而不会发生设置更改。

  • 查看对访问站点的用户、为运行 IIS 设置的用户或 COM 组件设置为模拟的用户帐户所做的任何用户帐户权限更改。
  • 查看在 IIS 中为站点或应用程序设置的应用程序池。
  • 查看 ASP 代码中的所有权限/身份验证/模拟代码。
  • 查看 COM 组件本身的设置。

实际问题

最终,问题归结为多个 IIS 站点和应用程序,每个都位于不同的 IIS 应用程序池中,使用相同的 COM 组件。这本身不是问题,除了 COM 组件被设置为允许最多 1 个应用程序池一次访问它。

页面工作了一段时间的原因是它设法第一个抓住了 COM 组件。如果有人访问它,使用相同 COM 组件的其他站点/页面/应用程序池将会失败。由于 COM 组件被设置为在 3 分钟后释放,这使得其他页面在被访问时有机会“抓住”它并阻止它在正在测试的新页面中使用。

修复

以下是在 Windows Server 2008 中增加 COM 组件的应用程序池限制的详细说明:

  1. 转到控制面板 > 管理工具 > 组件服务。

  2. 在树中,浏览 Component Services > My Computer > COM+ Applications 并找到您的自定义组件。

  3. 右键单击组件并获取属性。

  4. 在 Pooling & Recyling 属性页选项卡上,将 Pool Size 设置为大于 1 的数字,以匹配将同时从 IIS 或其他地方访问组件的潜在应用程序池的数量。

    COM+ 池化和回收

  5. 再次尝试您的网页,瞧,它又可以工作了!

于 2013-03-19T17:54:08.760 回答