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

时间:2011-01-07 14:24:35

标签: asp.net iis asp-classic windows-server-2003

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

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

当我打电话给支持我们服务器的小组时,我被告知它可能失败了,因为我没有关闭代码中的连接。但是,同一组进入,然后为此Extension Request应用程序创建了一个单独的应用程序池。从那以后它没有任何问题。

我做了一些谷歌搜索,因为我不喜欢被指责。我发现当您有多个使用不同框架的应用程序并且不将它们放在不同的应用程序池中时,也会出现“Server Application Unavailable”消息。

技术详情 - 我们网站结构树

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

来自我们的服务器支持小组:

'审核了IIS中的服务器日志和网站设置。不得不重置应用程序池,因为它不能正常工作。这更正了网站,现在又重新上线了。我们继续为扩展Web创建了一个应用程序池,因此它与主站点池隔离。在过去,我们已经看到其他应用程序在连接打开并且池填满时执行此操作。建议查看网站代码以确保没有任何连接处于打开状态。'

真实问题: 真正导致失败的是什么?连接是否未打开会发出ASP Classic问题?难道不会首先使用ExtensionRequest应用程序(超过两次)来保持连接打开吗?是否更有可能是因为他们没有首先在其自己的应用程序池中设置新应用程序而导致失败?

抱歉长篇大论

2 个答案:

答案 0 :(得分:2)

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

如果没有这些,很难推测问题的根本原因是什么。

<强>更新

OP错误地标记了他的问题,因此下一部分不再适用。但是我会留下来,因为我认为这些信息对遇到这些问题的人有用,也许会考虑迁移到IIS7.x.

<小时/> 你是正确的,在同一个应用程序池中运行两个不同的.NET Framework会导致这些错误,但这是你在Windows 2003 / IIS6上看到的,而不是Windows 2008 / IIS7。

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

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

因此,如果应用程序池配置为运行.NET Framework v4.0,那么只会加载该版本,即使您的应用程序是针对v2.0构建的。

这里有一篇关于它如何运作的好文章:

  

Achtung! IIS7 Preconditions

关于处理程序的部分大约一半解释了为什么preCondition功能可以减少意外将错误的.NET版本加载到池中的危险。

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

不关闭SQL连接不太可能导致此类严重错误。如果是这种情况,你很可能会看到死亡运行时错误的黄色屏幕。耗尽SQL连接通常不会使ASP.NET变形,以至于整个服务都能达到顶峰。

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

同样,您需要做的是获取应用程序&amp;系统事件日志和HTTPERR日志(它们驻留在%systemroot%\System32\LogFiles\HTTPERR。这将包含有关出错的线索和事实。

更新2:

在Windows 2003 / IIS6上,如果有两个运行不同ASP.NET版本的应用程序驻留在同一个池中,则收到此错误。根据我的经验(我为网络托管服务员工作),这是这个臭名昭着的错误页面的主要原因:

alt text

还有一个记录到应用程序事件日志的告诉事件:

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编写的,但可能是某些东西触发了将不同版本的框架加载到您站点的应用程序池中。

  • 根目录中有一个流氓web.config ...这将触发ASP.NET加载
  • 在站点脚本映射中有一个到ASP.NET 1.1的通配符映射(不太可能,但可能)

我倾向于认为您的新应用程序最终肯定会出现在其他站点或应用程序运行不同框架版本的池中。真正找到的唯一方法是获取应用程序事件日志并查找上面显示的事件。

答案 1 :(得分:0)

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

如果您运行的是不同版本的.NET,那么您肯定需要单独的池。如果您有选项,我会为每个应用程序推荐单独的池(即使在相同的.NET版本中)。

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

修改

如果在事件日志中找不到任何有用的内容,可以尝试:http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/