Il ruolo ZipEngine è bloccato tra il riavvio e lo stato Occupato

Questo articolo fornisce informazioni sulla risoluzione dei problemi in cui il ruolo ZipEngine è bloccato tra riavvio e stato occupato e genera un'eccezione che indica: Impossibile caricare il file o l'assembly 'WorkerAssembly - Tentativo di caricare un programma con un formato non corretto.

Versione originale del prodotto: Gestione API Service
Numero KB originale: 4464909

Nota

Fare riferimento all'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 procedura per ricreare il problema.

Sintomi

L'istanza del ruolo ZipEngine dell'applicazione Compressor è in continuo 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].

Risolvere i problemi relativi ai passaggi

Se il ruolo non viene avviato o viene riciclato tra gli stati di inizializzazione, occupato e arresto, 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 è in corso un'eccezione non gestita 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 contengono l'output di diagnostica chiave del runtime di Microsoft Azure, incluse informazioni quali avvio/arresto del ruolo, attività di avvio, avvio e arresto di OnStart, 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 ottiene un po'più di dettagli sull'eccezione dai log eventi di Microsoft Azure che indicano che il ruolo di lavoro di hosting del processo 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 di 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:\FusionLogsdel percorso del log fusion .

Screenshot che mostra le chiavi del Registro di sistema in Fusion.

Dopo aver verificato la presenza di "WorkerAssembly" nel log fusion, è possibile ottenere altre informazioni per ulteriori informazioni sulla 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 di fusion indica che si verifica un errore nel numero di bit dell'assembly. Se si esamina questo articolo di BadImageFormatException , la causa più probabile di questo errore è la seguente:

"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 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 scoprire la bitness dell'assembly, è possibile eseguire qualsiasi decompilatore .NET di propria scelta. È possibile trovare l'assembly seguente dopo la decompilazione di 'WorkerAssembly' usando ILSpy.

Questo è 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 è stato effettivamente caricato l'assembly 'WorkerAssembly' ed eseguendo alcune funzioni. Poiché si tratta di un assembly a 32 bit, il WaWorkerHost.exe non è stato in grado di caricare tale 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.