Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 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 der Konfiguration einer Ihrer IIS-Websites oder Webanwendungen auf einem IIS-Webserver einen verwalteten Handler oder ein verwaltetes Modul hinzufügen.
Dazu wählen Sie die Zielwebsite oder Webanwendung in der IIS-Manager-Konsole aus, klicken sie auf das Symbol für 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 Implementierung des verwalteten Moduls enthält, die Sie den Handlern oder Modulen hinzufügen möchten, eine Assembly ist, die auf nur 32-Bit-Umgebungen kompiliert wird, erhalten Sie die folgende Fehlermeldung aus der IIS-Manager-Konsole:
Fehler beim Ausführen dieses Vorgangs
Details: Diese Methode kann während der Initialisierungsphase 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. Auch in dieser Liste sind alle anderen . NET-referenzierte Assemblys. Dies wird von IIS ausgeführt, um zu bestimmen, welche dieser Schnittstellen entweder IHttpHandler- oder IHttpModule-Schnittstellen implementiert, je nachdem, ob Sie mit Handlern oder Modulen zu tun haben. Um alle Klassen aller Assemblys, die aus dem /bin
Ordner Ihrer Anwendung stammen, zu prüfen, 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 geprüft werden.
Normalerweise wird eine .NET-Assembly in Microsoft Intermediary Language (MSIL) kompiliert und soll plattformneutral sein (d. h. sie kann sowohl auf 64-Bit- als auch auf 32-Bit-Plattformen ausgeführt werden). Sie können eine .NET-Assembly auf nur 32-Bit-Plattformen oder nur 64-Bit-Plattformen kompilieren. In diesem Fall wird die MSIL weiter zu systemeigenem Code kompiliert, der für die 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 innerhalb eines 64-Bit-Prozesses in einer 64-Bit-Version von Windows ausgeführt wird (standardmäßig), wird die untergeordnete .NET-Anwendungsdomäne innerhalb eines 64-Bit-Prozesses erstellt. Es gibt keine Möglichkeit für die IIS-Manager-Konsole zu wissen, dass einige der .NET-Assemblys, die sich im Ordner "/bin" Ihrer Anwendung befinden, nur auf 32-Bit-Plattformen kompiliert werden, wenn versucht wird, sie zu laden, um die Konfigurationsänderungen auszuführen. Wenn eine Assembly für eine 32-Bit-Plattform auftritt, 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 entwurfsbedingt, da die IIS-Manager-Konsole die Zielbitanzahl für .NET-Assemblys für Ihre Anwendung nicht ermitteln kann. Daher wird davon ausgegangen, dass alle Assemblys auf MSIL kompiliert werden und plattformunabhängig sind, dass sie sowohl auf 32-Bit- als auch auf 64-Bit-Versionen von Windows ausgeführt werden können.
Problemumgehung
Um dieses Problem zu umgehen, stimmen Sie mit der Bitanzahl des inetmgr.exe Prozesses der Bitanzahl der Zielassembly überein, die innerhalb der untergeordneten .NET-Anwendungsdomäne geladen werden muss. Führen Sie dazu in einer 64-Bit-Version von Windows die folgende Befehlszeile über eine Eingabeaufforderung mit erhöhten Rechten aus:
mmc.exe /32 iis.msc
Dadurch wird die Microsoft Management Console (MMC) im 32-Bit-Modus geladen und auch das IIS-Manager-Konsolen-Snap-In in das MMC geladen. Da die IIS-Konsole jetzt in einem 32-Bit-Prozess ausgeführt wird, wird die untergeordnete .NET-Anwendungsdomäne in einem 32-Bit-Prozess erstellt, der der Zielbitanzahl der Assembly entspricht, die Sie als verwalteten Handler oder verwaltetes Modul konfigurieren möchten.
Schritte zum Reproduzieren
Erstellen Sie eine Klasse, die
IHttpModule
das Klassenbibliotheksprojekt von Visual Studio auf Zielplattformen implementiert oderIHttpHandler
kompiliert (Plattformziel: x86 in den Projektbuildeinstellungen).Nehmen Sie die resultierende .NET-Assembly, und stellen Sie sie im Bin-Ordner einer vorhandenen Webanwendung oder Website auf einem 64-Bit-Betriebssystem bereit, das auch IIS ausführt.
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.