ChatGPT解决这个技术问题 Extra ChatGPT

已检测到不适用于集成托管管道模式的 ASP.NET 设置

我安装了 DotNetOpenAuth SDK-3.4.5.10201.vsix,但无法正常工作。它在本地工作(当我作为本地主机运行时)但是当我尝试发布它时它不起作用。

我得到的 IIS 错误消息是

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

模块 ConfigurationValidationModule 通知 BeginRequest 处理程序 StaticFile 错误代码 0x80070032

那么有一些关于如何解决问题的建议:

你可以尝试的事情:

将配置迁移到 system.webServer/modules 部分。您可以手动执行此操作,也可以从命令行使用 AppCmd - 例如,%SystemRoot%\system32\inetsrv\appcmd migrate config "Default Web Site/"。使用 AppCmd 迁移您的应用程序将使其能够在集成模式下工作,并继续在经典模式下和以前版本的 IIS 上工作。如果您确定可以忽略此错误,可以通过将 system.webServer/validation@validateIntegratedModeConfiguration 设置为 false 来禁用它。或者,将应用程序切换到经典模式应用程序池 - 例如,%SystemRoot%\system32\inetsrv\appcmd set app "Default Web Site/" /applicationPool:"Classic .NET AppPool"。仅当您无法迁移应用程序时才执行此操作。 (将“默认网站”和“经典 .NET AppPool”设置为您的应用程序路径和应用程序池名称)

但问题是我无法访问 ISS 服务器,因为我不是它的所有者。有没有办法解决这个问题?


K
KyleMit

第二个选项是你想要的。

在您的 web.config 中,确保这些键存在:

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

这不应该真正影响您的应用程序的安全性。它只是关闭警告说您有一些不会使用的配置值。
如果您有不会使用的设置,那么这并不是非常合理的建议,那么您应该删除它们。
@Seph,不同意这不是合理的建议。许多 NuGet 安装(例如,DotLess)会将条目添加到适用于集成模式的部分,并且还会为非集成模式复制该设置。这称为可移植性,允许您的配置无论您使用的是IIS7/集成还是经典。将此验证设置保留为 true 的唯一原因是,当您添加无法在集成模式下运行的设置时,您可以让训练轮保持打开状态并让 IIS 对您大喊大叫。这是为没有经验的人准备的,但会妨碍您。
这种配置很烦人。 @MS:有更好的方法。
对于那些更喜欢修复错误而不是掩盖症状的人,我发布了一个替代答案。关于 NuGet 包,为什么我们仍然以 IIS 6/Classic 为目标?
J
Jeremy Cook

添加 <validation validateIntegratedModeConfiguration="false"/> 可解决问题,但不适用于所有情况。围绕这个问题跑了几次,我希望帮助其他人不仅克服这个问题,而且理解它。 (随着 IIS 6 逐渐成为神话和谣言,这变得越来越重要。)

背景:

这个问题和围绕它的混乱始于 ASP.NET 2.0 和 IIS 7 的引入。IIS 6 曾经并且继续只有一种管道模式,它相当于 IIS 7+ 所称的“经典”模式。对于在 IIS 7+ 上运行的所有应用程序,第二种、更新且推荐的管道模式称为“集成”模式。

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

经典模式仅限于无法与 IIS 管道交互的 ASP.NET 管道。本质上是一个请求,如果 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 模块不仅可以观察对静态图像文件的请求,还可以拦截这些请求并通过拒绝访问、记录请求等方式采取措施。

克服错误:

如果您正在运行最初为 IIS 6 构建的旧应用程序,也许您将其移至新服务器,那么在经典模式下运行该应用程序的应用程序池可能绝对没有问题。去吧,你不必难过。再一次,也许您正在对您的应用程序进行改造,或者它一直运行良好,直到您通过 NuGet、手动或通过其他方式安装了第 3 方库。在这种情况下,完全有可能将 httpHandlers 或 httpModules 添加到 system.web。结果是您看到的错误,因为 validateIntegratedModeConfiguration 默认为 true。现在您有两个选择: 从 system.web 中删除 httpHandlers 和 httpModules 元素。这有几个可能的结果:一切正常,一个共同的结果;您的应用程序继续抱怨,您继承的父文件夹中可能有一个 web.config,请考虑清理该 web.config;你已经厌倦了删除 NuGet 包不断添加到 system.web 的 httpHandlers 和 httpModules,嘿,做你需要的。如果这些选项不起作用或者比它的价值更麻烦,那么我不会告诉你你不能将 validateIntegratedModeConfiguration 设置为 false,但至少你知道你在做什么以及它为什么重要。

好读:

IIS 7.0 上的 ASP.NET 2.0 重大更改

ASP.NET 与 IIS 7 的集成

HTTP 处理程序和 HTTP 模块概述

*当然,如果您喜欢这种东西,可以通过 wildcard mappings 之类的咒语将各种奇怪的东西从 IIS 6/Classic 导入 ASP.NET 管道。


+1唯一的解决方案不是您的问题的答案,而是带有完美答案的解释的解决方案。它是什么以及为什么我们需要改变它,@Jeremy Cook 给出的这些回答问题。
这种解释使我解决了以集成模式托管在 IIS 7.5 中的小型测试站点的问题。当我创建一个新的 MVC 项目时,它在我的 Web.config 中添加了 httpModule Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule。这是因为我在创建新的 ASP.NET Web Aapplication 项目时选中了“将 Application Insights 添加到项目”选项。当我从 Web.config 中删除 httpModule 时,该站点运行时没有出现错误。将 validateIntegratedModeConfiguration 设置为 false 有效,但这只是一种创可贴的方法。
已检测到不适用于集成托管管道模式的 ASP.NET 设置。这是另一个无用的 Microsoft 错误消息。 ASP.net 有数以千计的设置,但微软认为不会在错误文本中包含导致错误的设置。 MS 由营销人员而不是工程师运行,所以不要指望事情会很快改善。 :-(
K
KyleMit

如果您仍然需要使用 HTTP 模块,则需要对其进行配置(.NET 4.0 框架),如下所示:

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
       <add name="MyModule" type="[Namespace].[Class], [assembly]"/>
   </modules>
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>

我认为 system.web 中的 HttpModules 属性适用于 ASP 3.5 或更早版本。对于 ASP 4 或更高版本,请使用 system.webserver 中的模块
@HoyCheung 实际上是使用集成或经典管道的问题,而不是.Net 的版本,它决定是使用 system.web/httpModules 还是 system.webServer/modules。
G
Gaʀʀʏ

我遇到了这个问题,但有不同的解决方法。它涉及更新 Control Panel>Administrative Tools>IIS Manager 并将我的应用程序站点的托管管道从 Integrated 恢复为 Classic


同意 - 这是更好的选择,而不是仅仅隐藏错误!确保您使用的是正确的应用程序池 - 应该是经典而不是集成
我正在使用 Visual Studio 2012,如何将应用程序池更改为经典。
如果您想使用 Integrated Pipeline 中提供的所有新功能,这不是一个好的解决方案。这就像说由于问题而从 4.0 恢复到 .NET 2.0。
要在 IIS 管理器中执行此操作,请转到左侧树中的 Application Pools,双击要更改的池,然后选择管道模式。
J
Jim Yu

检查您的 IIS 身份验证是否有任何冲突。即您启用匿名身份验证和 ASP.NET 模拟也可能导致错误。


N
Nil

在您的 web.config 中确保这些键存在:

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

以及检查 Asp.Net Impresonation = Disable In IIS Site Authetication


S
Sudhanshu Mishra

我遇到了这个问题并受到@Jeremy Cook 的回答的启发,我咬紧牙关找出到底是什么导致 IIS 7 集成模式不喜欢我的 web.config。这是我的场景:

Web API(版本 4.0.030506.0 又名旧版本).NET 4.0 Attribute Routing 3.5.6 for Web API [剧透警告:就是这个人!]

我想在一个项目中使用属性路由(不幸的是)必须使用 .NET 4,因此不能使用 Web API 2.2(需要 .NET 4.5)。善意的 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。
@RobertOschler 如果您使用的是 .NET 4.5,那么您已经在 AFAIK 中内置了属性路由 - 您不需要这个 NuGet 吗?
谢谢和废话。今天花了几个小时让 AttributeRouting 包运行 NuGet。我将其拉出并撤消了为使其正常工作而添加的所有代码“修复”,并将 Web API 2 Route() 属性替换为 GET() 属性。工作得很好。这些天我们真的需要一个专家系统来帮助我们处理所有这些包。
P
Paul

这对我有用:

删除最初创建的站点。在 IIS 清洁解决方案中重新创建站点 构建解决方案

当我最初创建该站点时,似乎有些事情发生了。我讨厌类似于“重新启动计算机,然后重新安装 Windows”的解决方案,但不知道是什么导致了错误。但是,这对我有用。快速简单。希望它可以帮助别人。


M
Mcan_Cicek

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

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

T
Termininja

local的方法是报错

https://i.stack.imgur.com/WJ6nx.png


除非您真的知道自己在做什么,否则不要更改此设置。这几乎从来都不是正确的答案。
如果目标是在经典模式下运行它,那么这是一个比隐藏表示它无法在集成模式下正确运行的验证错误更好的解决方案。
n
naveen rawat

就我而言,我在 web.config 文件中引用的 bin 文件夹中缺少 dll。因此,请检查您是否使用了 web.config 中的任何设置,但实际上没有 dll。

谢谢


M
Mladen Radosović

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


S
Shaiju T

下面的步骤解决了我的问题:

使用管理员权限打开 CMD 提示。

运行:iisreset.

希望这可以帮助。