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

2023-12-05

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

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

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

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

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

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

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

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

真正的问题:失败的真正原因是什么?连接保持打开状态不是 ASP Classic 问题吗?是否必须首先使用 ExtensionRequest 应用程序(两次以上)才能使连接保持打开状态?失败是否更有可能是由于他们一开始就没有在自己的应用程序池中设置新应用程序而造成的?

抱歉啰嗦了好久


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

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

Update:

OP 错误地标记了他的问题,因此下一节不再适用。不过,我将保留原样,因为我认为这些信息对于那些遇到这些问题并且可能正在考虑迁移到 IIS7.x 的人很有用。


You are correct that running two different .NET Framework's in the same application pool can cause these errors but that's something you'd tend to see on Windows 2003/IIS6, not Windows 2008/IIS7.

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

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

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

这里有一篇很棒的文章介绍了它是如何工作的:

阿赫东! IIS7先决条件

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

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

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

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

同样,您需要做的是获取应用程序和系统事件日志以及 HTTPERR 日志(它们驻留在%systemroot%\System32\LogFiles\HTTPERR。其中将包含有关问题所在的线索和事实。

更新2:

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

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 的通配符映射(不太可能,但有可能)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 自定义存储库基类 + QueryDslPredicateExecutor

    我已经发现QueryDslPredicateExecutor对于减少样板文件非常有用 但它似乎给工作带来了麻烦 我现在正在尝试延长JpaRepository使用自定义基类存储库 并且在启动时 Spring 无法正确实例化存储库 Custom
  • Docker:将 apt-key 与 alpine 镜像结合使用

    我正在尝试使用 alpine nodeJS docker 映像 但确实收到错误 bin sh apt key not found 我需要补充什么 FROM node 8 6 alpine RUN apt key adv keyserver
  • 输入层从深度学习模型的结构中消失

    我使用以下代码使用 VGG16 创建了 CNN 模型 但创建模型后 模型的输入层从结构中消失 见图 为什么输入层从结构中消失 vgg16 model keras applications vgg16 VGG16 model Sequenti
  • 如何使用 htaccess 规则停止直接执行 php 页面?

    在我的 htaccess 文件中 我定义了以下规则 使我的注册页面 URL 为http example com register RewriteRule register register php 上述规则完全没问题 但我可以从以下位置访问
  • C# int、Int32 和枚举

    If int是同义词Int32为什么 enum MyEnum Int32 Value 1 不编译 然而 enum MyEnum int Value 1 即使将光标悬停在 int 单词上也会显示 struct System Int32 底层类
  • FileStream 在顶部追加数据

    我正在开发一个实用程序 我想在文件顶部追加数据 但它是覆盖而不是追加 例如 考虑 file txt 这里存在一些东西 现在我想在当前行之前附加 此处存在更多内容 有没有办法可以不使用 2 FileStreams 不 文件系统基本上不支持将数
  • 如何将变量扩展到maven-archetype中的嵌套目录中

    假设我已经设置了groupId to com example and artifactId to fancy project 现在我想创建一个原型 这样在创建时会扩展为以下结构 src main com example fancy proj
  • MVC3 - 如何正确使用@html.checkbox?

    我是 MVC3 的新手 我不知道如何在 MVC 中使用复选框 我的视图中有一堆文本 例如 text1 text2 text3 text4 text5 submitbutton 该文本与任何模型无关 只是纯文本 我想为每个项目放置一个复选框并
  • 具有属性继承的表达式树导致参数异常

    继这篇文章之后 链接文本我正在尝试创建一个引用属性的表达式树 我的代码如下所示 public interface IFoo void X get set public interface IBar IFoo void Y get set p
  • 选择两个日期之间的记录

    我有以下查询 SELECT dm app id apt app name COUNT dm app id FROM dm openapp dm JOIN app table apt ON dm app id apt app id GROUP
  • SUMIF 包含数组中的元素之一 (OR)

    我有一个付款列表 我想总结其描述等于我的数组中的元素之一的成本 EMTE 120 00 Bread 35 24 Lidl 0 89 Plus 5 19 Aldi 2 29 Jumbo 4 70 所以用一个数组 Lidl Aldi 它会给我总
  • 当鼠标悬停在文本中的单词上时显示警报

    我已经为此苦苦挣扎了几天 我需要有人引导我走向正确的方向 我一直在网上搜索 我不确定我是否采取了正确的方法 我需要的是 每次有人将鼠标悬停在特定关键字上时 它都应该显示一个警报框 在这个例子中 这个词是 else 当我运行代码时 它不会给出
  • 如何在 Heroku 上使用本地 gem?

    我的 RoR 应用程序上有 gem 声明性授权的修改版本 它位于vendor gems declarative authorization下 我的 gemfile 有 gem declarative authorization 0 5 5
  • 如何在 Javascript 中使用递归函数时读取对象的属性?

    我想知道是否有人能指出我在这方面的正确方向 当我有一个对象时 我通常通过 FOR IN LOOP 读取它的属性 因为我知道属性是什么 因为我创建了这个对象 所以我知道键及其值是什么 我想知道是否还有其他方法 例如递归方法 来读取对象及其属性
  • 将字符串百分比转换为浮点数的干净方法是什么?

    我查看了标准库和 StackOverflow 但没有找到类似的问题 那么 有没有办法在不滚动我自己的函数的情况下执行以下操作 如果有人在没有内置方法的情况下编写出漂亮的函数 则会获得奖励积分 def stringPercentToFloat
  • 给Redis缓存添加过期时间

    我在我的 C 项目中实现了 Redis 缓存 我只是想知道如何才能超载Get
  • node.js 使 HTTP 服务器的请求和响应全局化?

    我刚刚开始使用 Node js 并运行了http nodebeginner org index html 很棒的入门教程 但我真的想知道是否可以将请求和响应设置为 全局 以便为当前传入请求加载的任何模块都可以访问这些 而不是注入 Ideas
  • 如何使用一个输入控件应用多个 ng-pattern

    我正在尝试使用 Angularjs 验证文本框中的邮政编码和电话号码 但这不起作用
  • 如何将 ImageSource 转换为 byte[] 并返回 ImageSource?

    我需要从用户那里获得图像文件路径并将图像存储在我的 SQL Server 数据库中 我从用户那里获取文件并使用该方法转换为 byte public static byte ImageToByteArray BitmapSource bitm
  • 在网站和虚拟目录之间混合 .NET 版本以及“服务器应用程序不可用”错误消息

    背景故事上个月 我们的开发团队创建了一个新的 asp net 3 5 应用程序 并将其发布在我们的生产网站上 工作完成后 我们请求服务器管理组将应用程序复制到我们的生产站点 并将虚拟目录配置为新应用程序 2010 年 12 月 27 日 两