Durch das Hinzufügen von wird das Symptom behoben, aber dies ist nicht für alle Situationen angemessen. Nachdem ich mich einige Male mit diesem Problem herumgeschlagen habe, hoffe ich, anderen nicht nur zu helfen, das Problem zu überwinden, sondern es auch zu verstehen. (Was immer wichtiger wird, da IIS 6 langsam zu Legende und Gerücht wird.)
Hintergrund:
Dieses Problem und die Verwirrung darüber begannen mit der Einführung von ASP.NET 2.0 und IIS 7. IIS 6 hatte und hat weiterhin nur einen Pipelinemodus, der dem entspricht, was IIS 7+ als "Klassik" -Modus bezeichnet. Der zweite, neuere und empfohlene Pipelinemodus für alle Anwendungen, die auf IIS 7+ ausgeführt werden, wird "Integrierter" Modus genannt.
Also, was ist der Unterschied? Der Schlüsselunterschied besteht darin, wie ASP.NET mit IIS interagiert.
-
Klassischer Modus ist auf eine ASP.NET-Pipeline beschränkt, die nicht mit der IIS-Pipeline interagieren kann. Im Wesentlichen kommt eine Anfrage herein, und wenn IIS 6/Klassisch durch die Serverkonfiguration mitgeteilt wurde, dass ASP.NET damit umgehen kann, übergibt IIS die Anfrage an ASP.NET und fährt fort. Die Bedeutung davon kann anhand eines Beispiels abgeleitet werden. Wenn ich den Zugriff auf statische Bilddateien autorisieren wollte, könnte ich dies nicht mit einem ASP.NET-Modul tun, weil die IIS 6-Pipeline diese Anfragen selbst behandeln wird und ASP.NET diese Anfragen nie sehen wird, da sie nicht übergeben wurden.* Andererseits ist die Autorisierung, welcher Benutzer auf eine .ASPX-Seite wie eine Anforderung für Foo.aspx zugreifen kann, selbst in IIS 6/Klassisch trivial, weil IIS diese Anfragen immer an die ASP.NET-Pipeline übergibt. Im Klassikmodus weiß ASP.NET nicht, was es nicht gesagt bekommen hat, und es gibt viel, was IIS 6/Klassisch ihm möglicherweise nicht sagt.
-
Integrierter Modus wird empfohlen, weil ASP.NET-Handler und -Module direkt mit der IIS-Pipeline interagieren können. Die IIS-Pipeline übergibt die Anfrage nicht einfach an die ASP.NET-Pipeline, jetzt ermöglicht sie es ASP.NET-Code, direkt an die IIS-Pipeline anzuknüpfen und alle Anfragen, die darauf treffen. Dies bedeutet, dass ein ASP.NET-Modul nicht nur Anfragen an statische Bilddateien beobachten, sondern diese Anfragen auch abfangen und Maßnahmen ergreifen kann, indem der Zugriff verweigert, die Anfrage protokolliert usw.
Überwindung des Fehlers:
- Wenn Sie eine ältere Anwendung ausführen, die ursprünglich für IIS 6 entwickelt wurde, und sie möglicherweise auf einen neuen Server verschoben haben, kann es absolut nichts ausmachen, den Anwendungspool dieser Anwendung im Classic-Modus auszuführen. Machen Sie weiter, Sie müssen sich nicht schlecht fühlen.
-
Andererseits haben Sie vielleicht Ihre Anwendung aufpoliert oder sie lief reibungslos, bis Sie eine Drittanbieterbibliothek über NuGet, manuell oder auf andere Weise installiert haben. In diesem Fall ist es durchaus möglich, dass httpHandlers
oder httpModules
zu system.web
hinzugefügt wurden. Das Ergebnis ist der Fehler, den Sie sehen, weil validateIntegratedModeConfiguration
standardmäßig auf true
gesetzt ist. Jetzt haben Sie zwei Möglichkeiten:
- Entfernen Sie die Elemente
httpHandlers
und httpModules
aus system.web
. Daraus ergeben sich einige mögliche Ergebnisse:
- Alles funktioniert einwandfrei, ein häufiges Ergebnis;
- Ihre Anwendung beschwert sich weiterhin, es könnte eine web.config in einem übergeordneten Ordner geben, von dem Sie erben, überlegen Sie, auch diese web.config aufzuräumen;
- Sie sind es leid, die
httpHandlers
und httpModules
zu entfernen, die NuGet-Pakete ständig zu system.web
hinzufügen, hey, tun Sie, was Sie tun müssen.
- Wenn diese Optionen nicht funktionieren oder mehr Ärger machen als es wert ist, werde ich Ihnen nicht sagen, dass Sie
validateIntegratedModeConfiguration
auf false
setzen können, aber zumindest wissen Sie, was Sie tun und warum es wichtig ist.
Gute Lektüre:
*Natürlich gibt es Möglichkeiten, alle möglichen seltsamen Dinge in die ASP.NET-Pipeline von IIS 6/Klassisch über Beschwörungen wie Platzhalterzuordnungen zu bringen, wenn Sie auf solche Dinge stehen.