Es wurde eine ASP.NET-Einstellung erkannt, die im integrierten verwalteten Pipeline-Modus nicht gilt

401

Ich habe DotNetOpenAuth SDK-3.4.5.10201.vsix installiert und kann es nicht zum Laufen bringen. Es funktioniert lokal (wenn ich als localhost ausgeführt werde), aber wenn ich versuche, es zu veröffentlichen, funktioniert es nicht.

Die IIS-Fehlermeldung, die ich erhalte, lautet

Fehler Zusammenfassung
HTTP - Fehler 500,22 - Internal Server Error
Ein ASP.NET - Einstellung erkannt wurde , die in Integrated gilt nicht verwalteten Pipelinemodus.

UND

Module       ConfigurationValidationModule  
Notification BeginRequest  
Handler      StaticFile  
Error Code   0x80070032  

Dann gibt es einige Vorschläge zur Lösung des Problems:

Dinge, die Sie ausprobieren können:

  • Migrieren Sie die Konfiguration in den system.webServer/modulesAbschnitt. Sie können dies manuell oder mithilfe von AppCmd ​​über die Befehlszeile tun, z %SystemRoot%\system32\inetsrv\appcmd migrate config "Default Web Site/". Wenn Sie AppCmdIhre Anwendung migrieren, kann sie im integrierten Modus arbeiten und im klassischen Modus und in früheren Versionen von IIS weiterarbeiten.

  • Wenn Sie sicher sind, dass es in Ordnung ist, diesen Fehler zu ignorieren, kann er durch Setzen system.webServer/validation@validateIntegratedModeConfiguration auf false deaktiviert werden .

  • Alternativ können Sie die Anwendung in einen Anwendungspool im klassischen Modus wechseln, z %SystemRoot%\system32\inetsrv\appcmd set app "Default Web Site/" /applicationPool:"Classic .NET AppPool". Tun Sie dies nur, wenn Sie Ihre Anwendung nicht migrieren können.
    (Setzen Sie "Standardwebsite" und "Classic .NET AppPool" auf Ihren Anwendungspfad und den Namen des Anwendungspools.)

Das Problem ist jedoch, dass ich keinen Zugriff auf den ISS-Server habe, da ich nicht dessen Eigentümer bin. Gibt es eine Möglichkeit, dies zu lösen?

Mikael
quelle

Antworten:

782

Die 2 nd Option ist diejenige , die Sie wollen.

Stellen Sie in Ihrem web.configsicher, dass diese Schlüssel vorhanden sind:

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
    </system.webServer>
</configuration>
David
quelle
10
Dies sollte die Sicherheit Ihrer App nicht wirklich beeinträchtigen. Es wird nur die Warnung deaktiviert, die besagt, dass Sie einige Konfigurationswerte haben, die nicht verwendet werden.
David
19
Dies ist kein wirklich guter Rat, wenn Sie Einstellungen haben, die nicht verwendet werden, sollten Sie sie entfernen.
Seph
33
@Seph, stimme nicht zu, dass dies kein guter Rat ist. Viele NuGet-Installationen (z. B. DotLess) fügen Einträge zu Abschnitten hinzu, die für den integrierten Modus gelten, und duplizieren diese Einstellung auch für den nicht integrierten Modus. Dies wird als Portabilität bezeichnet und ermöglicht es Ihrer Konfiguration, unabhängig davon, ob Sie IIS7 / integriert oder klassisch verwenden. Der einzige Grund, diese Validierungseinstellung zu belassen, truebesteht darin, dass Sie Ihre Trainingsräder eingeschaltet lassen und IIS anschreien können, wenn Sie eine Einstellung hinzufügen, die im integrierten Modus nicht funktioniert. Dies ist für Unerfahrene, steht aber im Weg.
Kirk Woll
5
Diese Art der Konfiguration ist ärgerlich. @MS: Es gibt einen besseren Weg.
Yonexbat
3
Für diejenigen, die es vorziehen, Fehler zu beheben, anstatt Symptome zu maskieren, habe ich eine alternative Antwort veröffentlicht. Warum zielen wir bei NuGet-Paketen immer noch auf IIS 6 / Classic ab?
Jeremy Cook
104

Das Hinzufügen <validation validateIntegratedModeConfiguration="false"/>behebt das Symptom, ist jedoch nicht für alle Umstände geeignet. Nachdem ich dieses Problem einige Male umgangen habe, hoffe ich, anderen zu helfen, das Problem nicht nur zu überwinden, sondern es auch zu verstehen. (Was immer wichtiger wird, wenn IIS 6 in Mythen und Gerüchte übergeht.)

Hintergrund:

Dieses Problem und die damit verbundene Verwirrung begannen mit der Einführung von ASP.NET 2.0 und IIS 7. IIS 6 hatte und hat nur einen Pipeline-Modus und entspricht dem, was IIS 7+ als "klassischen" Modus bezeichnet. Der zweite, neuere und empfohlene Pipeline-Modus für alle Anwendungen, die unter IIS 7+ ausgeführt werden, wird als "Integrierter" Modus bezeichnet.

Also, was ist der Unterschied? Der Hauptunterschied besteht darin, wie ASP.NET mit IIS interagiert.

  • Klassischer Modusist auf eine ASP.NET-Pipeline beschränkt, die nicht mit der IIS-Pipeline interagieren kann. Im Wesentlichen geht eine Anforderung ein, und wenn IIS 6 / Classic über die Serverkonfiguration mitgeteilt wurde, dass ASP.NET diese verarbeiten kann, gibt IIS die Anforderung an ASP.NET weiter und fährt fort. Die Bedeutung davon kann einem Beispiel entnommen werden. Wenn ich den Zugriff auf statische Bilddateien autorisieren würde, wäre dies mit einem ASP.NET-Modul nicht möglich, da die IIS 6-Pipeline diese Anforderungen selbst verarbeitet und ASP.NET diese Anforderungen niemals sieht, da sie nie übergeben wurden . * Andererseits ist es selbst in IIS 6 / Classic trivial, zu autorisieren, welche Benutzer auf eine ASPX-Seite wie eine Anforderung für Foo.aspx zugreifen können, da IIS diese Anforderungen immer an die ASP.NET-Pipeline weitergibt. Im klassischen Modus weiß ASP.NET nicht, was es nicht hat.

  • Der integrierte Modus wird empfohlen, da ASP.NET-Handler und -Module direkt mit der IIS-Pipeline interagieren können. Die IIS-Pipeline übergibt die Anforderung nicht mehr einfach an die ASP.NET-Pipeline. Jetzt kann ASP.NET-Code direkt in die IIS-Pipeline und alle Anforderungen eingebunden werden, die sie getroffen haben. Dies bedeutet, dass ein ASP.NET-Modul nicht nur Anforderungen an statische Bilddateien beobachten kann, sondern diese Anforderungen auch abfangen und Maßnahmen ergreifen kann, indem der Zugriff verweigert, die Anforderung protokolliert usw. wird.

Fehler überwinden:

  1. Wenn Sie eine ältere Anwendung ausführen, die ursprünglich für IIS 6 erstellt wurde, Sie sie möglicherweise auf einen neuen Server verschoben haben, ist möglicherweise absolut nichts falsch daran, den Anwendungspool dieser Anwendung im klassischen Modus auszuführen. Du musst dich nicht schlecht fühlen.
  2. Andererseits geben Sie Ihrer Anwendung möglicherweise ein Facelifting oder sie tuckerte einwandfrei, bis Sie eine Bibliothek eines Drittanbieters über NuGet manuell oder auf andere Weise installiert haben. In diesem Fall ist es durchaus möglich httpHandlersoder httpModuleswurde hinzugefügt system.web. Das Ergebnis ist der Fehler, den Sie aufgrund der validateIntegratedModeConfigurationStandardeinstellungen sehen true. Jetzt haben Sie zwei Möglichkeiten:

    1. Entfernen Sie die httpHandlersund httpModulesElemente aus system.web. Daraus ergeben sich einige mögliche Ergebnisse:
      • Alles funktioniert gut, ein gemeinsames Ergebnis;
      • Ihre Anwendung beschwert sich weiterhin. Möglicherweise befindet sich in einem übergeordneten Ordner, von dem Sie erben, eine web.config. Bereinigen Sie auch diese web.config.
      • Sie werden es leid, die httpHandlersund httpModulesdie NuGet-Pakete zu entfernen, und system.webtun, was Sie brauchen.
  3. Wenn diese Optionen nicht funktionieren oder sind mehr Mühe , als es wert ist , dann bin ich nicht , dass Sie gehen zu sagen , dass Sie nicht einstellen validateIntegratedModeConfigurationzu false, aber zumindest wissen Sie , was Sie tun und warum es wichtig ist .

Gut liest:

* Natürlich gibt es Möglichkeiten, alle möglichen seltsamen Dinge von IIS 6 / Classic über Beschwörungsformeln wie Platzhalterzuordnungen in die ASP.NET-Pipeline zu integrieren , wenn Sie solche Dinge mögen.

Jeremy Cook
quelle
+1 nur Lösung ist keine Antwort auf Ihr Problem, sondern Lösung mit Erklärung, die perfekte Antwort ist. Was es ist und warum wir dies ändern müssen, beantworten diese Antwortfragen von @Jeremy cook.
Rikin Patel
Diese Erklärung führte mich dazu, das Problem für eine kleine Testwebsite zu beheben, die in IIS 7.5 im integrierten Modus gehostet wird. Beim Erstellen eines neuen MVC-Projekts wurde das httpModule Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule in meiner Web.config hinzugefügt. Dies liegt daran, dass ich beim Erstellen eines neuen ASP.NET-Webanwendungsprojekts die Option "Anwendungserkenntnisse zum Projekt hinzufügen" aktiviert habe. Als ich das httpModule aus Web.config entfernte, funktionierte die Site ohne den Fehler. Das Setzen von validateIntegratedModeConfiguration auf false hat funktioniert, aber das war nur ein bandaider Ansatz.
iCode
2
Es wurde eine ASP.NET-Einstellung erkannt, die im integrierten verwalteten Pipeline-Modus nicht gilt. Dies ist eine weitere nutzlose Microsoft-Fehlermeldung. ASP.net verfügt über Tausende von Einstellungen, aber Microsoft hat nicht daran gedacht, die Fehlerursache in den Fehlertext aufzunehmen. MS wird eher von Vermarktern als von Ingenieuren betrieben. Erwarten Sie also nicht, dass sich die Situation bald verbessern wird. :-(
Paul McCarthy
35

Wenn Sie das HTTP-Modul weiterhin verwenden müssen, müssen Sie es (.NET 4.0-Framework) wie folgt konfigurieren:

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
       <add name="MyModule" type="[Namespace].[Class], [assembly]"/>
   </modules>
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
Ashraf Sayied-Ahmad
quelle
2
Ich denke, die HttpModules-Eigenschaft in system.web ist für ASP 3.5 oder früher. Verwenden Sie für ASP 4 oder höher Module in system.webserver
Trio Cheung
1
@HoyCheung ist eigentlich eine Frage der Verwendung der integrierten oder klassischen Pipeline, nicht der Version von .Net, die entscheidet, ob system.web / httpModules oder system.webServer / modules verwendet werden.
Pauli Østerø
29

Ich bin auf dieses Problem gestoßen, hatte aber eine andere Lösung. Es beinhaltete das Aktualisieren Control Panel>Administrative Tools>IIS Managerund Zurücksetzen der verwalteten Pipeline meiner App-Site von Integratedauf Classic.

Gaʀʀʏ
quelle
3
Einverstanden - dies ist die bessere Option, als nur den Fehler zu verbergen!
Stellen
1
Ich verwende Visual Studio 2012, wie kann ich den App-Pool in Classic ändern?
10
Dies ist keine gute Lösung, wenn Sie alle neuen Funktionen von Integrated Pipeline nutzen möchten. Dies ist wie das Zurücksetzen auf .NET 2.0 von 4.0 aufgrund eines Problems.
Trevor de Koekkoek
Gehen Sie dazu in IIS Manager Application Poolsin die Baumstruktur links, doppelklicken Sie auf den Pool, den Sie ändern möchten, und wählen Sie den Pipeline-Modus.
Steve Smith
8

Überprüfen Sie, ob bei Ihrer IIS-Authentifizierung ein Konflikt vorliegt. Wenn Sie also die anonyme Authentifizierung und den ASP.NET-Identitätswechsel aktivieren, kann der Fehler ebenfalls auftreten.

Jim Yu
quelle
5

Stellen Sie in Ihrer web.config sicher, dass diese Schlüssel vorhanden sind:

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

Überprüfen Sie außerdem die Option Asp.Net Impresonation = In IIS Site Authetication deaktivieren

Null
quelle
3

Ich bin auf dieses Problem gestoßen und habe mich von der Antwort von @Jeremy Cook inspirieren lassen. Ich habe in die Kugel gebissen, um herauszufinden, was zum Teufel dazu geführt hat, dass der integrierte IIS 7-Modus meine web.config nicht mag. Hier ist mein Szenario:

  1. Web-API (Version 4.0.030506.0, auch bekannt als die alte)
  2. .NET 4.0
  3. Attribut-Routing 3.5.6 für die Web-API [Spoiler-Warnung: Es war dieser Typ!]

Ich wollte Attribut-Routing in einem Projekt verwenden, das (leider) .NET 4 verwenden musste und daher die Web-API 2.2 (die .NET 4.5 benötigt) nicht verwenden konnte. Das gut gemeinte NuGet-Paket hat diesen Abschnitt unter dem <system.web>Abschnitt hinzugefügt :

<system.web>
<httpHandlers>
      <add verb="*" path="routes.axd" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
    </httpHandlers>
</system.web>

[Ich sage gut gemeint, weil dieser Teil für ältere Versionen von IIS erforderlich ist]

Durch das Entfernen dieses Abschnitts bin ich am HTTP 500.23 vorbeigekommen !!

Zusammenfassung: Ich stimme Jeremys Worten zu, dass es wichtig ist zu verstehen, warum Dinge nicht funktionieren, anstatt nur "das Symptom zu maskieren". Selbst wenn Sie das Symptom maskieren müssen, wissen Sie, was Sie tun (und warum) :-)

Sudhanshu Mishra
quelle
Vielen Dank. Ich habe AttributeRouting hinzugefügt, einschließlich des ApG Controller-Add-On-NuGet-Pakets, und das Entfernen des von Ihnen angegebenen Abschnitts aus web.config hat das Problem behoben. Ich bin jedoch etwas besorgt, da meine MVC-Webanwendung bereits .NET Framework 4.5 verwendet hat.
Robert Oschler
2
@RobertOschler Wenn Sie mit .NET 4.5 arbeiten, ist das Attribut-Routing bereits in AFAIK integriert. Sie sollten dieses NuGet nicht benötigen.
Sudhanshu Mishra
Danke und Mist. Es hat heute einige Stunden gedauert, bis das AttributeRouting-Paket NuGet ausgeführt hat. Ich habe es herausgezogen und alle Code-Korrekturen, die ich hinzugefügt habe, rückgängig gemacht, damit es funktioniert, und das Attribut GET () durch das Attribut Web API 2 Route () ersetzt. Hat super funktioniert. Wir brauchen heutzutage wirklich ein Expertensystem, um uns bei all diesen Paketen zu helfen.
Robert Oschler
2

Das hat bei mir funktioniert:

  1. Löschen Sie die ursprünglich erstellte Site.
  2. Erstellen Sie die Site in IIS neu
  3. Saubere Lösung
  4. Lösung erstellen

Es scheint, als wäre etwas nach Süden gegangen, als ich die Seite ursprünglich erstellt habe. Ich hasse Lösungen, die ähnlich sind wie "Starten Sie Ihren Computer neu und installieren Sie dann Windows neu", ohne zu wissen, was den Fehler verursacht hat. Aber das hat bei mir funktioniert. Schnell und einfach. Hoffe es hilft jemand anderem.

Paul
quelle
0

In meinem Fall fehlte mir die DLL im Ordner bin, auf den in der Datei web.config verwiesen wurde. Überprüfen Sie also, ob Sie eine Einstellung in web.config verwendet haben, aber tatsächlich keine DLL haben.

Vielen Dank

Naveen Rawat
quelle
0

Ich habe einige Stunden gebraucht, um das Problem zu beheben, da alle Einstellungen, die ich hier zu diesem Fehler gefunden habe, gleich waren, aber immer noch nicht funktionierten. Das Problem war, dass ich einen Ordner in meinem Webdienst hatte, von dem aus die Datei an das WinCE-Gerät gesendet werden sollte, nachdem dieser Ordner in eine Anwendung mit Classic.NetAppPool konvertiert wurde, begann er zu funktionieren.

Mladen Radosović
quelle
0

Der folgende Schritt hat mein Problem gelöst:

Öffnen Sie die CMDEingabeaufforderung mit Administratorrechten.

Lauf : iisreset.

Hoffe das hilft.

Shaijut
quelle
-1

Die Methode für local ist der Fehler

Bild

Hossein Khazai
quelle
7
Ändern Sie diese Einstellung nur, wenn Sie wirklich wissen, was Sie tun. Dies ist fast nie die richtige Antwort.
NickG