Die ZipEngine-Rolle bleibt zwischen dem Status "Neustarten" und "Beschäftigt" hängen
Dieser Artikel enthält Informationen zur Problembehandlung bei Problemen, bei denen die ZipEngine-Rolle zwischen dem Neustart- und beschäftigt-Zustand hängen bleibt und eine Ausnahme ausgelöst wird, die besagt: Datei oder Assembly 'WorkerAssembly konnte nicht geladen werden - Es wurde versucht, ein Programm mit einem falschen Format zu laden.
Ursprüngliche Produktversion: API-Verwaltungsdienst
Ursprüngliche KB-Nummer: 4464909
Notiz
Lesen Sie den Artikel zur Azure Cloud Service Troubleshooting Series. Dies ist das erste Szenario des Labors. Stellen Sie sicher, dass Sie die Laboreinrichtungsanweisungen für die Kompressor-Anwendung wie folgt befolgt haben, um das Problem neu zu erstellen.
Symptome
Die ZipEngine-Rolleninstanz der Kompressor-Anwendung wird ständig zwischen dem Neustart- und beschäftigt-Zustand durchlaufen, der die folgende ausnahme im blatt Azure-Portal auslöst:
Unhandled Exception: Could not load file or assembly 'WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format. at ZipEngine.WorkerRole.OnStart() at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum) at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge. <InitializeRole> b__0() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()'[2018-08-12T11:28:39Z] Last exit time: [2018/08/12, 11:28:39.434].
Problembehandlungsschritte
Wenn Ihre Rolle nicht gestartet wird oder zwischen den Zuständen „Initialisieren“, „Ausgelastet“ und „Beenden“ wechselt, wirft Ihr Code bei jedem Neustart der Rolle möglicherweise eine nicht behandelte Ausnahme in einem der Lebenszyklusereignisse aus. Wenn Sie also den obigen Aufrufstapel sorgfältig betrachten, würden Sie feststellen, dass eine unbehandelte Ausnahme über die OnStart() -Methode Ihrer Workerrolle erfolgt. Der beste Ort, um mit der Problembehandlung für diese Art von Szenarien zu beginnen, besteht darin, Microsoft Azure-Ereignisprotokolle zu überprüfen, die wichtige Diagnoseausgabe aus der Microsoft Azure-Runtime enthalten, einschließlich Informationen wie Rollenstart-Starts/Stopps, Startaufgaben, OnStart-Start, Abstürze, Wiederverwendung usw.
System.BadImageFormatException
Process ID: 5132
Process Name: WaWorkerHost
Thread ID: 4
AppDomain Unhandled Exception for role ZipEngine_IN_0
Exception: Could not load file or assembly 'WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
at ZipEngine.WorkerRole.OnStart()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.
<InitializeRole>
b__0()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Nun erhalten Sie ein bisschen ausführlichere Informationen zu der Ausnahme von Microsoft Azure-Ereignisprotokollen , die besagt, dass die Rolle des Prozesshosting-Workers aufgrund von System.BadImageFormatException nicht in der Lage ist, die Assembly "WorkerAssembly" zu laden. Wenn ein Prozess nicht in der Lage ist, eine Assembly zu laden, empfiehlt es sich immer, Fusionsprotokolle zu erfassen. Nehmen Sie die folgenden Registrierungsschlüsseländerungen unter dem Pfad HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
vor, um die Fusionsprotokollierung zu aktivieren. Allen - Vollzugriffsberechtigung für den Fusionsprotokollpfadordner erteilen C:\FusionLogs
.
Wenn Sie das Fusionsprotokoll auf "WorkerAssembly" überprüfen, erhalten Sie möglicherweise weitere Informationen zur weiteren Problembehandlung.
*** Assembly Binder Log Entry (8/12/2018 @ 12:51:00 PM) ***
The operation failed.
Bind result: hr = 0x8007000b. An attempt was made to load a program with an incorrect format.
Assembly manager loaded from: D:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable E:\base\x64\WaWorkerHost.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///E:/approot
LOG: Initial PrivatePath = E:\approot
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = RoleManager
Calling assembly : ZipEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\approot\ZipEngine.dll.config
LOG: Using host configuration file:
LOG: Using machine configuration file from D:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///E:/approot/WorkerAssembly.DLL.
LOG: Assembly download was successful. Attempting setup of file: E:\approot\WorkerAssembly.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
ERR: Invalid assembly platform or ContentType in file (hr = 0x8007000b).
ERR: Run-from-source setup phase failed with hr = 0x8007000b.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.
Die oben hervorgehobene Fehlermeldung in Fusionsprotokollen gibt an, dass etwas in der Bitanzahl der Assembly falsch ist. Wenn Sie diesen Artikel "BadImageFormatException " untersuchen, korreliert die wahrscheinlichste Ursache dieses Fehlers mit folgendem Fehler:
"Eine DLL oder ausführbare Datei wird als 64-Bit-Assembly geladen, enthält jedoch 32-Bit-Features oder -Ressourcen. Sie basiert z. B. auf COM-Interoperabilität oder ruft Methoden in einer 32-Bit-Dynamic Link Library auf. Um diese Ausnahme zu beheben, legen Sie die Platform-Zieleigenschaft des Projekts auf x86 (anstelle von x64 oder AnyCPU) fest, und kompilieren Sie es erneut."
Um die Bitanzahl der Assembly zu ermitteln, können Sie einen beliebigen .NET-Dekompilierer Ihrer Wahl ausführen. Möglicherweise finden Sie die folgende Assembly nach dem Dekompilieren von "WorkerAssembly" mithilfe von ILSpy.
Dies ist eine 32-Bit-Assembly (x86).
// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0
Azure ist eine 64-Bit-Umgebung. Aus diesem Grund funktionieren für eine 32-Bit-Umgebung kompilierte .NET-Assemblys nicht in Azure. Um diese Ausnahme zu beheben, legen Sie die Platform-Zieleigenschaft des Projekts "WorkerAssembly" auf x64 (anstelle von x86 oder AnyCPU) fest, und kompilieren Sie es erneut.
Wenn Sie den Code der WorkerRole.cs für die ZipEngine-Rolle überprüfen, würden Sie unter zwei Codezeilen feststellen, die die Assembly "WorkerAssembly" tatsächlich laden und eine Funktion ausführen. Da es sich um eine 32-Bit-Assembly handelte, konnte die WaWorkerHost.exe diese Assembly nicht laden.
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
Kontaktieren Sie uns für Hilfe
Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.