我们最近升级到了 .Net 4.0,并为我们的应用程序编写了一个自定义部署脚本,该脚本使用该Microsoft.Web.Administration
库来执行创建网站和设置应用程序池等操作。我们开始在开发人员框上测试代码,它似乎可以正常工作。然后我们注意到,如果开发人员重新构建应用程序,它将停止运行,并且 IIS7 会给我们这个(实际上没用的)错误消息:
服务器应用程序不可用
您尝试访问的 Web 服务器中的 Web 应用程序当前不可用。请点击 Web 浏览器中的“刷新”按钮重试您的请求。
管理员注意:可以在 Web 服务器的应用程序事件日志中找到一条错误消息,详细说明此特定请求失败的原因。请查看此日志条目以找出导致此错误发生的原因。
如果我们手动回收应用程序池,应用程序将立即重新启动。我们在应用程序日志中看不到任何事件或错误。池设置为在配置更改时自动启动和回收。
我们尝试了应用程序池、应用程序和 ASP.net 设置中的各种设置组合。我们尝试以不同的用户帐户运行应用程序池。我们尝试删除应用程序池和应用程序,然后通过 UI 手动重新创建它们,但问题仍然存在。
就好像使用该Microsoft.Web.Administration
库会毒害机器,所以它永远不会再自动重新启动应用程序池?!!
我们会非常感激任何见解或调试建议。除非我们了解导致这种情况发生的原因,否则我们无法在任何生产系统上运行它。
答案1
我在搜索完全相同的错误描述时找到了此线程。并且我找到了导致我的情况的原因。
我正在将应用程序从 .net 3.5 转换为 4.0,在将应用程序池从 2.0 更改为 4.0 后,这种情况就开始了。它只发生在经典模式下,而不是集成模式下。
在我的例子中,我在 web.config 中有通配符 http 处理程序:
<add name="Wildcard .net 64 bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="bitness64"/>
<add name="Wildcard .net 32 bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="bitness32"/>
但是我忘了将路径更改为 .net 4.0 目录
因此更改后\v2.0.50727\aspnet_isapi.dll
网站\v4.0.30319\aspnet_isapi.dll
就开始正常运行。
希望这对某人有帮助。
答案2
您是否调用了 Site.Stop()?这确实会将站点的 autoStart 属性更改为 false,调用 Start() 会将其重新设置为 true。
为了确保没有其他花招,我建议将文件 %windir%\System32\Inetsrv\Config\ApplicationHost.config 复制到某个备份目录,然后运行部署应用程序,然后对两个文件进行 Diff 并查看差异,我猜你会看到一些 autoStart 属性设置为 false。如果是这种情况,这是由于调用 Stop 并且从未再次调用 Start(在 CommitChanges 之前)造成的
检查您的代码是否具有以下模式:Site.Stop() ... 在内存中执行更改.... ServerManager.CommitChanges() .... Site.Start()
您永远不会提交最后一次将其修改为自动启动的启动
答案3
不确定您是否已经经历过这种情况,但您不能在同一个应用程序池中混合使用 .NET 4 和 .NET 2 应用程序。这个问题最近困扰了我们。我们必须创建一个新的应用程序池,并将新的 .NET 4 Web 应用程序分配给该池。所有 .NET 2 应用程序都驻留在另一个池中。
到那时,一切都很幸福,你提到的消息也消失了。