Delen via


De rol ZipEngine blijft hangen tussen opnieuw opstarten en bezet

Dit artikel bevat informatie over het oplossen van problemen waarbij de ZipEngine-rol is vastgelopen tussen de status Opnieuw opstarten en Bezet en het genereren van een uitzondering met de mededeling: Kan bestand of assembly 'WorkerAssembly - Er is een poging gedaan om een programma met een onjuiste indeling te laden.

Oorspronkelijke productversie: API Management Service
Oorspronkelijk KB-nummer: 4464909

Notitie

Raadpleeg het artikel over azure Cloud Service Troubleshooting Series. Dit is het eerste scenario van het lab. Zorg ervoor dat u de installatie-instructies van het lab voor de Compressor-toepassing hebt gevolgd om het probleem opnieuw te maken.

Symptomen

Het zipEngine-rolexemplaren van de Compressor-toepassing loopt voortdurend tussen opnieuw opstarten en Bezet , waardoor de onderstaande onverwerkte uitzondering op de blade azure Portal wordt gegenereerd:

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].

Stappen voor probleemoplossing

Als uw rol niet wordt gestart of opnieuw wordt gebruikt tussen de statussen initialiseren, bezet en stoppen, kan uw code een onverwerkte uitzondering veroorzaken binnen een van de levenscyclus-gebeurtenissen telkens wanneer de rol opnieuw wordt opgestart. Dus als u de bovenstaande aanroepstack zorgvuldig bekijkt, ziet u dat een niet-verwerkte uitzondering wordt uitgevoerd vanuit de OnStart() -methode van uw werkrol. De beste plek om te beginnen met het oplossen van problemen voor dit soort scenario's, is door Microsoft Azure-gebeurtenislogboeken te controleren die belangrijke diagnostische uitvoer van de Microsoft Azure Runtime bevatten, waaronder informatie zoals rollen starten/stoppen, opstarttaken, Starten en stoppen, OnRun starten, crashes, recycles, enzovoort.

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()

Nu krijgt u wat meer informatie over de uitzondering van Microsoft Azure-gebeurtenislogboeken waarin staat dat de werkrol voor het hosten van processen de assembly WorkerAssembly niet kan laden vanwege System.BadImageFormatException. Over het algemeen is het een goed idee om Fusion-logboeken vast te leggen wanneer een proces een assembly niet kan laden. Breng de volgende registersleutelwijzigingen aan onder het pad HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion om fusielogboekregistratie in te schakelen. Iedereen de machtiging Volledig beheer geven voor de map C:\FusionLogsvan het fusionlogboekpad.

Schermopname van de registersleutels onder Fusion.

Bij het controleren van het fusielogboek voor WorkerAssembly krijgt u mogelijk meer informatie voor verdere probleemoplossing.

*** 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.

Het bovenstaande gemarkeerde foutbericht in fusionlogboeken geeft aan dat er iets mis is in de bitheid van de assembly. Als u dit Artikel BadImageFormatException bekijkt, komt de meest waarschijnlijke oorzaak van deze fout overeen met deze:

"Een DLL of uitvoerbaar bestand wordt geladen als een 64-bits assembly, maar bevat 32-bits functies of resources. Het is bijvoorbeeld afhankelijk van COM-interoperabiliteit of aanroepen van methoden in een 32-bits dynamische koppelingsbibliotheek. Als u deze uitzondering wilt oplossen, stelt u de doeleigenschap Platform van het project in op x86 (in plaats van x64 of AnyCPU) en compileert u deze opnieuw.

Als u de bitheid van de assembly wilt achterhalen, kunt u elke .NET-decompiler van uw keuze uitvoeren. Mogelijk vindt u de volgende assembly na het decompileren van 'WorkerAssembly' met behulp van ILSpy.

Dit is 32-bits 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 is een 64-bits omgeving. Daarom werken .NET-assembly's die voor een 32-bits doel zijn gecompileerd niet in Azure. Als u deze uitzondering wilt oplossen, stelt u de doeleigenschap Platform van het project workerAssembly in op x64 (in plaats van x86 of AnyCPU) en compileert u deze opnieuw.

Als u de code van WorkerRole.cs voor de rol ZipEngine bekijkt, ziet u onder twee regels code die de assembly 'WorkerAssembly' daadwerkelijk laadde en een bepaalde functie uitvoert. Omdat het een 32-bits assembly was, kon de WaWorkerHost.exe die assembly niet laden.

WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();

Contacteer ons voor hulp

Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.