Le rôle ZipEngine est bloqué entre l’état Redémarrage et Occupé

Cet article fournit des informations sur la résolution des problèmes dans lesquels le rôle ZipEngine est bloqué entre le redémarrage et l’état Occupé et lève une exception indiquant : Impossible de charger le fichier ou l’assembly ' WorkerAssembly - Une tentative de chargement d’un programme avec un format incorrect a été effectuée.

Version du produit d’origine : Gestion des API Service
Numéro de la base de connaissances d’origine : 4464909

Remarque

Reportez-vous à l’article sur la série de résolution des problèmes des services cloud Azure. Il s’agit du premier scénario du labo. Vérifiez que vous avez suivi les instructions de configuration du labo pour l’application Compressor pour recréer le problème.

Symptômes

Le rôle ZipEngine instance de l’application Compressor est constamment en boucle entre l’état Redémarrage et Occupé, ce qui lève l’exception non prise en charge ci-dessous dans le panneau Portail 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].

Étapes de résolution des problèmes

Si votre rôle ne démarre pas ou qu’il est recyclé entre les états d’initialisation, occupé et d’arrêt, votre code peut lever une exception non prise en charge dans l’un des événements de cycle de vie à chaque redémarrage du rôle. Par conséquent, si vous examinez attentivement la pile des appels ci-dessus, vous remarquerez qu’une exception non prise en charge est en cours à partir de la méthode OnStart() de votre rôle de travail. Le meilleur endroit pour commencer la résolution des problèmes pour ce type de scénarios consiste à case activée journaux des événements Microsoft Azure qui contiennent la sortie de diagnostic clé du runtime Microsoft Azure, y compris des informations telles que les démarrages/arrêts de rôle, les tâches de démarrage, le démarrage et l’arrêt, le démarrage à l’exécution, les incidents, les recyclages, etc.

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

Vous obtenez maintenant un peu plus de détails sur l’exception des journaux des événements Microsoft Azure indiquant que le rôle de travail d’hébergement de processus n’est pas en mesure de charger l’assembly « WorkerAssembly » en raison de System.BadImageFormatException. En général, lorsqu’un processus n’est pas en mesure de charger un assembly, il est toujours recommandé de capturer des journaux Fusion. Apportez les modifications suivantes à la clé de Registre sous le chemin d’accès HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion pour activer la journalisation fusion. Accordez à tout le monde - Contrôle total l’autorisation d’accès au dossier C:\FusionLogschemin du journal de fusion .

Capture d’écran montrant les clés de Registre sous Fusion.

Après avoir vérifié le journal de fusion pour « WorkerAssembly », vous pouvez obtenir plus d’informations pour la résolution des problèmes supplémentaires.

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

Le message d’erreur mis en surbrillance ci-dessus dans les journaux de fusion indique qu’un problème est survenu dans le nombre de bits de l’assembly. Si vous examinez cet article BadImageFormatException , la cause la plus probable de cette erreur correspond à ceci :

« Une DLL ou un exécutable est chargé en tant qu’assembly 64 bits, mais il contient des fonctionnalités ou des ressources 32 bits. Par exemple, il s’appuie sur com interop ou appelle des méthodes dans une bibliothèque de liens dynamiques 32 bits. Pour résoudre cette exception, définissez la propriété Cible de plateforme du projet sur x86 (au lieu de x64 ou AnyCPU) et recompilez. »

Pour connaître le nombre de bits de l’assembly, vous pouvez exécuter n’importe quel décompileur .NET de votre choix. Vous pouvez trouver l’assembly suivant après la décompilation de « WorkerAssembly » à l’aide d’ILSpy.

Il s’agit d’un assembly 32 bits (x86).

// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0

Azure est un environnement 64 bits. Par conséquent, les assemblys .NET compilés pour une cible 32 bits ne fonctionnent pas sur Azure. Pour résoudre cette exception, définissez la propriété platform du projet « WorkerAssembly » sur x64 (au lieu de x86 ou AnyCPU) et recompilez.

Si vous passez en revue le code de WorkerRole.cs pour le rôle ZipEngine, vous remarquerez ci-dessous deux lignes de code qui chargeaient réellement l’assembly « WorkerAssembly » et effectuaient une fonction. Étant donné qu’il s’agissait d’un assembly 32 bits, le WaWorkerHost.exe n’a pas pu charger cet assembly.

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

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.