错误 80004005 的一般故障排除
鉴于导致此错误的潜在原因种类繁多,可能很难解决此错误。快速的互联网搜索显示了大量的建议。
将可能的问题缩小到合理列表的关键方面是代码正在工作,但突然开始失败,没有任何代码更改。假设没有重大的 IIS 或 COM 配置更改,这排除了以下可能性,例如,为组件使用了错误的类名,或组件未正确注册。相反,必须将注意力转向 IIS 和 COM 本身的某些配置,这些配置可能会导致不一致的行为,而不会发生设置更改。
- 查看对访问站点的用户、为运行 IIS 设置的用户或 COM 组件设置为模拟的用户帐户所做的任何用户帐户权限更改。
- 查看在 IIS 中为站点或应用程序设置的应用程序池。
- 查看 ASP 代码中的所有权限/身份验证/模拟代码。
- 查看 COM 组件本身的设置。
实际问题
最终,问题归结为多个 IIS 站点和应用程序,每个都位于不同的 IIS 应用程序池中,使用相同的 COM 组件。这本身不是问题,除了 COM 组件被设置为允许最多 1 个应用程序池一次访问它。
页面工作了一段时间的原因是它设法第一个抓住了 COM 组件。如果有人访问它,使用相同 COM 组件的其他站点/页面/应用程序池将会失败。由于 COM 组件被设置为在 3 分钟后释放,这使得其他页面在被访问时有机会“抓住”它并阻止它在正在测试的新页面中使用。
修复
以下是在 Windows Server 2008 中增加 COM 组件的应用程序池限制的详细说明:
转到控制面板 > 管理工具 > 组件服务。
在树中,浏览 Component Services > My Computer > COM+ Applications 并找到您的自定义组件。
右键单击组件并获取属性。
在 Pooling & Recyling 属性页选项卡上,将 Pool Size 设置为大于 1 的数字,以匹配将同时从 IIS 或其他地方访问组件的潜在应用程序池的数量。
再次尝试您的网页,瞧,它又可以工作了!