Fehler beim Konfigurieren von verwalteten 32-Bit-Handlern in der IIS-Konsole

Dieser Artikel hilft Ihnen, das Problem zu umgehen, das auftritt, wenn Sie versuchen, einer Website- oder Webanwendungskonfiguration über Internetinformationsdienste (IIS)-Manager ein verwaltetes Modul oder einen verwalteten Handler hinzuzufügen.

Ursprüngliche Produktversion:   Internetinformationsdienste 8.0, Internetinformationsdienste 8.5
Ursprüngliche KB-Nummer:   3194551

Problembeschreibung

Stellen Sie sich folgendes Szenario vor:

  • Sie möchten einen verwalteten Handler oder ein verwaltetes Modul zur Konfiguration einer Ihrer IIS-Websites oder Webanwendungen auf einem IIS-Webserver hinzufügen.

  • Dazu wählen Sie die Zielwebsite oder Webanwendung in der IIS-Manager-Konsole aus, klicken auf das Symbol "Handlerzuordnungen" oder "Modulzuordnungen", und klicken Sie dann im Bereich auf der rechten Seite der Konsole auf die Verknüpfungen "Verwalteten Handler hinzufügen" oder "Verwaltetes Modul hinzufügen".

Wenn auf dem Server ein 64-Bit-Betriebssystem ausgeführt wird und die .NET-Assembly, die den verwalteten Handler oder die Verwaltete Modulimplementierung enthält, die Sie der Liste der Handler oder Module hinzufügen möchten, eine Assembly ist, die für nur 32-Bit-Umgebungen kompiliert wurde, erhalten Sie die folgende Fehlermeldung von der IIS Manager-Konsole:

Fehler beim Ausführen dieses Vorgangs
Details: Diese Methode kann während der Initialisierungsphase vor dem Start der Anwendung nicht aufgerufen werden.

Ursache

Wenn Sie versuchen, einen verwalteten Handler oder ein verwaltetes Modul hinzuzufügen, erstellt die IIS-Manager-Konsole eine Liste aller Klassen, die sich in den .NET-Assemblys befinden, die aus dem /bin Ordner Ihrer Anwendung und deren Abhängigkeiten stammen. Ebenfalls in dieser Liste befindet sich eine beliebige andere . Assemblys, auf die mit NET verwiesen wird. IiS verwendet dies, um zu bestimmen, welche IHttpHandler- oder IHttpModule-Schnittstellen implementiert werden, je nachdem, ob Es sich um Handler oder Module handelt. Um alle Klassen aus allen Assemblys zu überprüfen, die aus dem /bin Ordner Ihrer Anwendung stammen, erstellt die IIS-Manager-Konsole eine untergeordnete .NET-Anwendungsdomäne innerhalb des inetmgr.exe Prozesses, in den diese Klassen geladen und auf die Implementierung der oben genannten Schnittstellen überprüft werden.

Normalerweise wird eine .NET-Assembly nach Unten zu Microsoft Intermediary Language (MSIL) kompiliert und als plattformneutral konzipiert (d. h. sie kann sowohl auf 64-Bit- als auch auf 32-Bit-Plattformen ausgeführt werden). Sie können eine .NET-Assembly so kompilieren, dass sie nur auf 32-Bit-Plattformen oder nur auf 64-Bit-Plattformen ausgerichtet ist. In diesem Fall wird die MSIL weiter zu systemeigenem Code kompiliert, der für den Prozessoranweisungssatz dieser Plattform spezifisch ist. Wenn Sie dies tun, kann die Assembly nicht in einem Prozess geladen werden, der nicht mit der Zielbitanzahl der Kompilierung übereinstimmt: Beim Versuch, eine Assembly für eine 64-Bit-Plattform innerhalb eines 32-Bit-Prozesses zu laden, wird ein Fehler zurückgegeben.

Da die IIS-Manager-Konsole in einem 64-Bit-Prozess mit einer 64-Bit-Version von Windows ausgeführt wird (standardmäßig), wird die untergeordnete .NET-Anwendungsdomäne innerhalb eines 64-Bit-Prozesses erstellt. Die IIS-Manager-Konsole kann nicht wissen, dass einige der .NET-Assemblys, die sich im Ordner "/bin" Ihrer Anwendung befinden, so kompiliert werden, dass sie nur auf 32-Bit-Plattformen ausgerichtet sind, wenn versucht wird, sie zu laden, um die Konfigurationsänderungen auszuführen. Wenn eine Assembly für eine 32-Bit-Plattform gefunden wird, wird das Laden von Assemblys in der untergeordneten .NET-Anwendungsdomäne innerhalb des inetmgr.exe-Prozesses beendet, und der im Abschnitt "Symptome" beschriebene Fehler wird in der IIS-Konsole angezeigt.

Dieses Verhalten ist beabsichtigt, da die IIS Manager-Konsole die Zielbitanzahl für .NET-Assemblys für Ihre Anwendung nicht bestimmen kann. Daher wird davon ausgegangen, dass alle Assemblys zu MSIL kompiliert werden und plattformunabhängig sind, sodass sie sowohl in 32-Bit- als auch in 64-Bit-Versionen von Windows ausgeführt werden können.

Problemumgehung

Um dieses Problem zu umgehen, ordnen Sie die Bitanzahl des inetmgr.exe Prozesses der Bitanzahl der Zielassembly zu, die innerhalb der untergeordneten .NET-Anwendungsdomäne geladen werden muss. Führen Sie dazu in einer 64-Bit-Version von Windows die folgende Befehlszeile an einer Eingabeaufforderung mit erhöhten Rechten aus:

mmc.exe /32 iis.msc 

Dadurch wird die Microsoft Management Console (MMC) im 32-Bit-Modus und das IIS Manager-Konsolen-Snap-In in die MMC geladen. Da die IIS-Konsole jetzt in einem 32-Bit-Prozess ausgeführt wird, wird die untergeordnete .NET-Anwendungsdomäne innerhalb eines 32-Bit-Prozesses erstellt, der der Zielbitanzahl der Assembly entspricht, die Sie als verwalteten Handler oder verwaltetes Modul konfigurieren möchten.

Schritte zum Reproduzieren

  1. Erstellen Sie eine Klasse, die IHttpModule das Klassenbibliotheksprojekt implementiert oder anschließend aus Visual Studio IHttpHandler kompiliert, um 32-Bit-Plattformen als Ziel zu verwenden (Plattformziel: x86 in den Projektbuildeinstellungen).

  2. Verwenden Sie die resultierende .NET-Assembly, und stellen Sie sie im Bin-Ordner einer vorhandenen Webanwendung oder Website auf einem 64-Bit-Betriebssystem bereit, auf dem auch IIS ausgeführt wird.

  3. Wechseln Sie zum IIS-Manager, und versuchen Sie, entweder einen verwalteten Handler oder ein verwaltetes Modul über die Schnittstelle hinzuzufügen, und sie erhalten den Fehler.