Asp.net 在网站和虚拟目录之间混合.NET版本以及;“服务器应用程序不可用”;错误消息

Asp.net 在网站和虚拟目录之间混合.NET版本以及;“服务器应用程序不可用”;错误消息,asp.net,iis,asp-classic,windows-server-2003,Asp.net,Iis,Asp Classic,Windows Server 2003,背景故事 上个月,我们的开发团队创建了一个新的asp.net 3.5应用程序,将其发布在我们的生产网站上。完成工作后,我们要求管理are服务器的组将应用程序复制到我们的生产站点,并将虚拟目录配置为新的应用程序 2010年12月27日,两名公众“吉瑙猪”被选中使用该应用程序,效果非常好。 2010年12月30日,我们收到内部员工的通知,当该员工试图访问应用程序(这是业务流程所有者)时,他们收到了“服务器应用程序不可用”消息 当我打电话给服务器支持的小组时,他们告诉我可能失败了,因为我没有在代码中关

背景故事
上个月,我们的开发团队创建了一个新的asp.net 3.5应用程序,将其发布在我们的生产网站上。完成工作后,我们要求管理are服务器的组将应用程序复制到我们的生产站点,并将虚拟目录配置为新的应用程序

2010年12月27日,两名公众“吉瑙猪”被选中使用该应用程序,效果非常好。 2010年12月30日,我们收到内部员工的通知,当该员工试图访问应用程序(这是业务流程所有者)时,他们收到了“服务器应用程序不可用”消息

当我打电话给服务器支持的小组时,他们告诉我可能失败了,因为我没有在代码中关闭连接。然而,同一组加入,然后为这个扩展请求应用程序创建了一个单独的应用程序池。从那以后就没有问题了

我在谷歌上搜索了一下,因为我不喜欢被人指责。我发现,当您有多个使用不同框架的应用程序并且没有将它们放在不同的应用程序池中时,也会出现“服务器应用程序不可用”消息

技术细节-我们网站结构的树

Main Website <-- ASP Classic
         +-Virtual Directory(ExtensionRequest) <-- ASP 3.5 

主网站很难说;可能有很多原因(使用了太多的资源,在.NET之外调用导致某些东西崩溃,等等)。我会查看事件日志,看看你是否能在那里找到什么

如果您运行的是不同版本的.NET,您肯定需要单独的池。如果您可以选择,我建议为每个应用程序提供单独的池(即使在相同的.NET版本中)

至于“关闭连接”(我假定您指的是与数据库的连接)。如果您正在创建“低级”连接(即SqlConnection、SqlCommand),那么请确保将它们包装在“using”语句中,否则您的连接池可能会被填满。根据我的经验,在这种情况下,您应该会收到常规的.NET错误。如果您使用的是ORM,这应该不是问题

编辑:


如果在事件日志中找不到任何有用的内容,可以尝试以下操作:

您确实需要获取并查看服务器报告这些错误期间的服务器应用程序和系统事件以及HTTPERR日志

没有这些,就很难推测问题的根源是什么

更新:

OP错误地标记了他的问题,因此下一节不再适用。但是,我将保留这些信息,因为我认为这些信息对遇到这些问题的人很有用,可能会考虑迁移到IIS7.x。
在同一个应用程序池中运行两个不同的.NET Framework可能会导致这些错误,这是正确的,但在Windows 2003/IIS6上,而不是Windows 2008/IIS7上,您可能会看到这些错误

IIS7使用稍微不同的方法来指定加载哪个.NET Framework版本,它由应用程序池的
managedRunTimeVersion
属性确定。当请求由IIS/ASP.NET处理时,站点的处理程序映射使用
前置条件
属性来确定何时加载所需的处理程序(这有点像以前版本的IIS中的脚本映射)

此机制可防止将不正确的运行时版本加载到应用程序池的工作进程中

因此,如果将应用程序池配置为运行.NET Framework v4.0版,则仅加载该版本,即使您的应用程序是根据v2.0构建的

这里有一篇很好的文章介绍了它的工作原理:

关于处理程序的部分解释了为什么意外地将错误的.NET版本加载到池中的危险可以通过
前置条件
功能得到缓解

服务器应用程序不可用错误通常意味着发生了灾难性的事情(例如将错误的ASP.NET版本的ISAPI筛选器加载到已经运行的工作进程中)

不关闭SQL连接不太可能导致此类严重错误。如果是这样的话,您很可能会看到死亡运行时错误的黄色屏幕。SQL连接不足通常不会使ASP.NET变形,从而使整个服务达到最佳状态

我的主要怀疑是权限问题,应用程序池标识无法正确访问应用程序文件夹。但这只是一种预感

同样,您需要做的是获取应用程序和系统事件日志以及HTTPERR日志(它们位于
%systemroot%\System32\LogFiles\HTTPERR
中)。这些日志将包含有关出错原因的线索和事实

更新2:

在Windows 2003/IIS6上,如果有两个运行不同ASP.NET版本的应用程序驻留在同一个池中,则会出现此错误。根据我的经验(我为web hoster工作),这是此臭名昭著的错误页面的主要原因:

应用程序事件日志中还记录了一个信号装置事件:

Event Type: Error Event Source: ASP.NET 2.0.50727.0 Event Category: None Event ID: 1062 Date: 12/01/2011 Time: 12:31:43 User: N/A Computer: KK-DEBUG Description: It is not possible to run two different versions of ASP.NET in the same IIS process. Please use the IIS Administration Tool to reconfigure your server to run the application in a separate process. 事件类型:错误 事件源:ASP.NET 2.0.50727.0 活动类别:无 活动编号:1062 日期:12/01/2011 时间:12:31:43 用户:不适用 计算机:KK-DEBUG 说明: 不可能在同一台计算机上运行两个不同版本的ASP.NET IIS进程。请使用IIS管理工具重新配置您的 服务器在单独的进程中运行应用程序。 虽然您的根应用程序可能不是用ASP.NET编写的,但很可能是有什么东西触发了将不同版本的框架加载到您站点的应用程序池中

  • 根目录中有一个rogue
    web.config
    ,这将触发ASP.NET加载
  • 在站点脚本m中有一个到ASP.NET 1.1的通配符映射