Il ruolo ZipEngine è bloccato tra Riavvio e Stato occupato
Questo articolo fornisce informazioni sulla risoluzione dei problemi in cui il ruolo ZipEngine è bloccato tra il riavvio e lo stato occupato e genera un'eccezione che indica: Non è stato possibile caricare il file o l'assembly 'WorkerAssembly - È stato effettuato un tentativo di caricare un programma con un formato non corretto.
Versione originale del prodotto: servizio Gestione API
Numero KB originale: 4464909
Note
Vedere l'articolo sulla serie di risoluzione dei problemi dei servizi cloud di Azure, questo è il primo scenario del lab. Assicurarsi di aver seguito le istruzioni di configurazione del lab per l'applicazione Compressor in base a questa situazione, per ricreare il problema.
Sintomi
L'istanza del ruolo ZipEngine dell'applicazione Compressor esegue costantemente un ciclo tra Riavvio e Stato occupato generando l'eccezione non gestita seguente nel pannello portale di Azure:
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].
Procedura di risoluzione dei problemi
Se il ruolo non viene avviato o passa in modo ciclico tra gli stati di arresto, di inizializzazione e di occupato, il codice potrebbe generare un'eccezione non gestita all'interno di uno degli eventi del ciclo di vita ogni volta che il ruolo viene riavviato. Pertanto, se si esamina attentamente lo stack di chiamate precedente, si noterà che un'eccezione non gestita viene eseguita dal metodo OnStart() del ruolo di lavoro. Il punto migliore per iniziare la risoluzione dei problemi per questo tipo di scenari consiste nel controllare i log eventi di Microsoft Azure che contiene l'output di diagnostica chiave di Microsoft Azure Runtime, incluse informazioni quali avvio/arresto del ruolo, attività di avvio, avvio onstart e arresto, avvio OnRun, arresti anomali, riciclo e così via.
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()
Ora si ottengono altri dettagli sull'eccezione dei registri eventi di Microsoft Azure che dicono che il processo che ospita il ruolo di lavoro non è in grado di caricare l'assembly "WorkerAssembly" a causa di System.BadImageFormatException. In generale, quando un processo non è in grado di caricare un assembly, è sempre consigliabile acquisire i log Fusion. Apportare le modifiche seguenti alla chiave del Registro di sistema nel percorso HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
per abilitare la registrazione fusion. Concedere a Tutti - Controllo completo l'autorizzazione per la cartella C:\FusionLogs
del percorso del log fusion .
Dopo aver controllato il log fusion per "WorkerAssembly", è possibile ottenere altre informazioni per ulteriori operazioni di risoluzione dei problemi.
*** 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.
Il messaggio di errore evidenziato in precedenza nei log fusion indica che si è verificato un errore nel bit dell'assembly. Se si esamina questo articolo di BadImageFormatException , la causa più probabile di questo errore è correlata a questo:
"Una DLL o un eseguibile viene caricato come assembly a 64 bit, ma contiene funzionalità o risorse a 32 bit. Ad esempio, si basa sull'interoperabilità COM o chiama i metodi in una libreria di collegamento dinamico a 32 bit. Per risolvere questa eccezione, impostare la proprietà di destinazione platform del progetto su x86 (anziché x64 o AnyCPU) e ricompilare".
Per individuare il livello di bit dell'assembly, è possibile eseguire qualsiasi decompiler .NET di propria scelta. È possibile trovare l'assembly seguente dopo la decompilazione di 'WorkerAssembly' con ILSpy.
Si tratta di un assembly a 32 bit (x86).
// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0
Azure è un ambiente a 64 bit, pertanto gli assembly .NET compilati per una destinazione a 32 bit non funzioneranno in Azure. Per risolvere questa eccezione, impostare la proprietà di destinazione platform del progetto "WorkerAssembly" su x64 (anziché x86 o AnyCPU) e ricompilare.
Se si esamina il codice di WorkerRole.cs per il ruolo ZipEngine, si noterà che sotto due righe di codice stava effettivamente caricando l'assembly "WorkerAssembly" ed eseguendo alcune funzioni. Poiché si tratta di un assembly a 32 bit, il WaWorkerHost.exe non è riuscito a caricare l'assembly.
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
Contattaci per ricevere assistenza
In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.