从IIS 7上的经典ASP创建COM +组件时"Server.CreateObject失败"

Eri*_*ikE 4 iis-7 com+ createobject asp-classic

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

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

MyObject = Server.CreateObject("MyCustomComponent.MyCustomObject")
Run Code Online (Sandbox Code Playgroud)

服务器对象错误'ASP 0177:80004005'

Server.CreateObject失败

/path/script.asp,第xx行

80004005

可能是什么问题呢?我做了一个互联网搜索,发现了几十个可能的答案,其中没有一个似乎与问题有任何关系.我知道我正在使用正确的对象名称 - 它刚刚工作了一段时间.什么也没有变!我花了差不多2个小时试图解决这个问题并且空洞.

Eri*_*ikE 10

错误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. 在树中,浏览组件服务>我的电脑> COM +应用程序,然后找到您的自定义组件.

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

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

    COM +汇集和回收

  5. 再试一次你的网页,瞧,再次运作!