检测到一个在集成式托管管道模式下不适用的ASP.NET设置

435

我安装了DotNetOpenAuth SDK-3.4.5.10201.vsix,但是我无法让它正常工作。当我以本地主机运行时,它可以工作,但是在尝试发布时就无法工作。

我得到的IIS错误信息是:

错误摘要
HTTP错误500.22 - 内部服务器错误
已检测到一个不适用于集成式托管管道模式的ASP.NET设置。

和:

Module       ConfigurationValidationModule  
Notification BeginRequest  
Handler      StaticFile  
Error Code   0x80070032  
然后,有一些解决该问题的建议: 尝试的方法: 1.将配置迁移到system.webServer/modules部分。您可以手动执行此操作,也可以使用命令行中的AppCmd - 例如:%SystemRoot%\system32\inetsrv\appcmd migrate config "Default Web Site/"。使用AppCmd来迁移您的应用程序将使其能够在集成模式下工作,并且继续在经典模式和之前的IIS版本上工作。 2.如果您确定可以忽略此错误,则可以通过将system.webServer/validation@validateIntegratedModeConfiguration设置为false来禁用它。 3.或者,将应用程序切换到Classic模式应用程序池-例如:%SystemRoot%\system32\inetsrv\appcmd set app "Default Web Site/" /applicationPool:"Classic .NET AppPool"。仅当您无法迁移应用程序时才这样做。(将“Default Web Site”和“Classic .NET AppPool”设置为您的应用程序路径和应用程序池名称) 问题是我没有访问ISS服务器的权限,因为我不是它的所有者。有没有办法解决这个问题?
14个回答

833

你需要的是第二个选项。

在你的web.config文件中,请确保这些键已经存在:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

11
这不应该真正影响您应用程序的安全性。它只是关闭了警告,提示您有一些配置值将不会被使用。 - David
19
如果你有不会使用的设置,那么将它们删除并不是一个过分谨慎的建议。 - Seph
34
@Seph,我不同意这不是一个可行的建议。许多NuGet安装(例如DotLess)会向适用于集成模式的部分添加条目,并为非集成模式复制该设置。这称为可移植性,使得您的配置可以在使用IIS7 /集成或传统模式时都能正常工作。将此验证设置保留为 true 的唯一原因是,这样您就可以保留入门级别的设置,并在添加无法在集成模式中使用的设置时,让IIS提示您。 这对于没有经验的人来说是有帮助的,但也会造成影响。 - Kirk Woll
5
这种配置很烦人。@MS:有一种更好的方法。 - yonexbat
3
针对那些更喜欢修复错误而不是掩盖症状的人,我已经发布了一个备选答案。关于NuGet包,为什么我们还在针对IIS 6 / Classic进行目标设置? - Jeremy Cook
显示剩余5条评论

124

添加<validation validateIntegratedModeConfiguration="false"/>可以解决这个问题,但并不适用于所有情况。由于我曾多次遇到这个问题,因此希望能帮助其他人不仅克服问题,还要理解它。这变得越来越重要,因为IIS 6已经逐渐淡出了人们的视线。

背景:

这个问题及其周围的混乱始于ASP.NET 2.0和IIS 7的推出。IIS 6只有一种管道模式,并且相当于IIS 7+称之为“经典”模式的模式。对于在IIS 7+上运行的所有应用程序,第二个、较新、也是推荐的管道模式称为“集成”模式。

那么,有什么区别呢?关键的区别在于ASP.NET如何与IIS交互。

  • 经典模式 仅限于一个 ASP.NET 管道,无法与 IIS 管道交互。基本上,当请求进来时,如果已经通过服务器配置告诉 IIS 6/Classic 可以由 ASP.NET 处理,则 IIS 将请求交给 ASP.NET 并继续执行。这个例子可以说明其重要性。如果我想授权访问静态图片文件,则不能使用 ASP.NET 模块,因为 IIS 6 管道将自己处理这些请求,而 ASP.NET 永远不会看到这些请求,因为它们从未被移交。另一方面,在 IIS 6/Classic 中授权哪些用户可以访问 .ASPX 页面(例如对 Foo.aspx 的请求)非常简单,因为 IIS 总是将这些请求交给 ASP.NET 管道。在经典模式下,ASP.NET 不知道它没有被告知的东西,而 IIS 6/Classic 可能没有告诉它很多。

  • 集成模式 是推荐的,因为 ASP.NET 处理程序和模块可以直接与 IIS 管道交互。IIS 管道不再只是简单地将请求交给 ASP.NET 管道,现在它允许 ASP.NET 代码直接连接到 IIS 管道和所有请求。这意味着 ASP.NET 模块不仅可以观察静态图像文件的请求,而且可以拦截这些请求并采取行动,例如拒绝访问、记录请求等。

克服错误:
  1. 如果您正在运行一个旧的应用程序,最初是为IIS 6构建的,或许您将其移动到了新服务器上,那么在Classic模式下运行该应用程序的应用程序池可能没有任何问题。放心去做吧。
  2. 然而,也许您正在给您的应用程序进行改进,或者它一直很好地运行着,直到您通过NuGet、手动方式或其他方式安装第三方库。在这种情况下,完全有可能 system.web 中已经添加了 httpHandlershttpModules。由于 validateIntegratedModeConfiguration 默认为 true,所以会出现您看到的错误。现在您有两个选择:

    1. system.web 中删除 httpHandlershttpModules 元素。有几种可能的结果:
      • 一切正常,这是一个常见的结果;
      • 您的应用程序继续抱怨,可能存在一个父文件夹中的 web.config,您可以考虑清理该 web.config;
      • 您厌倦了删除 NuGet 包不断添加到 system.webhttpHandlershttpModules,嘿,做您需要做的。
  3. 如果这些选项不起作用或者带来的麻烦大于它所值,那么我不会告诉您不能将 validateIntegratedModeConfiguration 设置为 false,但至少您知道自己在做什么以及为什么很重要。

好的阅读材料:

*当然,如果你喜欢那种东西,通过类似通配符映射的咒语,可以将各种奇怪的东西放入来自IIS 6 / Classic的ASP.NET流水线中。


1
+1 只是一个解决方案,而不是你问题的答案,但是带有解释的解决方案才是完美的答案。@Jeremy cook 的回答给出了这个是什么以及为什么我们需要改变它的答案。 - Rikin Patel
这个解释让我修复了一个托管在IIS 7.5中集成模式下的小型测试站点的问题。当我创建一个新的MVC项目时,它会在我的Web.config中添加httpModule,Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule。这是因为在创建新的ASP.NET Web应用程序项目时,我保留了“将应用程序洞察添加到项目”的选项。当我从Web.config中删除httpModule时,该站点可以正常工作而没有错误。将validateIntegratedModeConfiguration设置为false可以解决问题,但这只是一种权宜之计。 - iCode
2
检测到一个在集成托管管道模式下不适用的ASP.NET设置。这是又一个无用的微软错误消息。ASP.net有数千个设置,但微软没有想到在错误文本中包含导致错误的设置。微软由市场营销人员而非工程师管理,因此不要指望事情会很快改善。 :-( - Paul McCarthy

37
如果你仍需要使用HTTP模块,你需要按以下方式配置它(.NET 4.0框架):
<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
       <add name="MyModule" type="[Namespace].[Class], [assembly]"/>
   </modules>
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>

2
我认为system.web中的HttpModules属性适用于ASP 3.5或更早版本。对于ASP 4或更高版本,请使用system.webserver中的模块。 - Hoy Cheung
2
@HoyCheung 这实际上是使用集成管道或经典管道的问题,而不是 .Net 的版本决定是否使用 system.web/httpModules 或 system.webServer/modules。 - Pauli Østerø

30
我遇到了这个问题,但解决方法有所不同。 它包括更新 控制面板>管理工具>IIS 管理器 并将我的应用程序站点的托管管道从 集成 恢复为 经典

3
同意 - 这是比简单隐藏错误更好的选择!确保您使用正确的应用程序池 - 应该是经典而不是集成的。 - Swomble
1
我正在使用Visual Studio 2012,如何将应用程序池更改为经典模式。 - user2913305
10
如果你想使用集成管道(Integrated Pipeline)中所有可用的新功能,这并不是一个好的解决方案。这就像因为出现了问题而从.NET 4.0回退到2.0一样。 - Trevor de Koekkoek
要在IIS管理器中完成此操作,请转到左侧树中的“应用程序池”,双击要更改的池,并选择管道模式。 - Steve Smith

10
检查您的IIS身份验证是否存在冲突。例如,启用匿名身份验证和ASP.NET模拟身份验证可能会导致错误。

这对我来说是唯一可行的答案。 - JohnOpincar

8
请确认您的web.config文件中已存在以下键值对:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

除了检查IIS网站身份验证中的Asp.Net Impresonation = Disable之外,还需要进行以下操作:


3
我遇到了这个问题,受@Jeremy Cook答案的启发,我下定决心找出是什么原因导致IIS 7集成模式不喜欢我的web.config。以下是我的情况:
  1. Web API(版本4.0.030506.0,也就是旧版)
  2. .NET 4.0
  3. Web API的Attribute Routing 3.5.6 [剧透:就是这小伙子!]
我想在一个项目中使用属性路由,在这个项目中(不幸的是)必须使用.NET 4,因此不能使用需要.NET 4.5的Web API 2.2。好心的NuGet包在<system.web>部分下添加了这个部分:
<system.web>
<httpHandlers>
      <add verb="*" path="routes.axd" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
    </httpHandlers>
</system.web>

[我说得很明白,因为在旧版本的IIS中需要这个部分]

删除此部分使我克服了HTTP 500.23错误!!

摘要: 我赞同Jeremy的话,重要的是要理解为什么事情不起作用,而不仅仅是“掩盖症状”。即使您必须掩盖症状,您也知道自己在做什么(以及为什么):-)


谢谢。我添加了AttributeRouting,包括Api Controller插件NuGet包,并从web.config中删除了您指定的部分,问题得到解决。但是,我有点担心,因为我的MVC Web应用程序已经在使用.NET Framework 4.5。 - Robert Oschler
2
@RobertOschler 如果你使用的是.NET 4.5,据我所知,你已经内置了属性路由 - 你不应该需要这个NuGet吧? - Sudhanshu Mishra
谢谢和废话。今天我花了几个小时来安装AttributeRouting包运行NuGet。我把它拿出来,并撤销了所有的代码“修复”,用Web API 2 Route()属性替换了GET()属性。效果很好。现在我们真的需要一个专家系统来帮助我们处理所有这些包。 - Robert Oschler

2

以下方法适用于我:

  1. 删除原创建的站点。
  2. 在 IIS 中重新创建站点。
  3. 清空解决方案。
  4. 构建解决方案。

似乎在我最初创建站点时出现了问题。我不喜欢那些类似于“重启电脑,然后重新安装 Windows”而不知道导致错误原因的解决方案。但是,这对我起作用了。快速简单,希望它能帮助其他人。


2

检查这些密钥是否存在于您的配置文件中

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>

0

我花了几个小时才解决了这个问题,因为我在这里找到的所有关于这个错误的设置都是相同的,但它仍然不起作用。 问题是我的 Web 服务中有一个文件夹,应该从中将文件发送到 WinCE 设备,在将该文件夹转换为使用 Classic.NetAppPool 的应用程序后,它开始工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接