Le rôle ZipEngine est bloqué entre le redémarrage et l’état de la disponibilité

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 de l’état occupé et la génération d’une exception indiquant : impossible de charger le fichier ou l’assembly’WorkerAssembly-une tentative de chargement d’un programme avec un format incorrect.

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

Notes

Reportez-vous à l’article sur la série de dépannage de service Cloud Azure, il s’agit du premier scénario de l’atelier. Assurez-vous que vous avez suivi les instructions de configuration de l’atelier pour l’application de compression conformément à ce qui suitpour recréer le problème.

Symptômes

L’instance de rôle ZipEngine de l’application de compresseur est constamment en boucle entre le redémarrage et l’état de la charge de l’exception non gérée dans le portail Azure du 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].

Dépannage des étapes

Si votre rôle ne démarre pas ou est en cours de recyclage entre l’État initialiser, occupé et arrêté, votre code peut lever une exception non gérée dans l’un des événements de cycle de vie chaque fois que le rôle redémarre. Par conséquent, si vous examinez attentivement la pile d’appels ci-dessus, vous remarquerez qu’une exception non gérée passe par la méthode OnStart () de votre rôle worker. Le meilleur moyen de commencer la résolution des problèmes pour ce type de scénario consiste à vérifier les journaux des événements Microsoft Azure qui contiennent la sortie de diagnostic de clés de Microsoft Azure Runtime, notamment des informations telles que le démarrage/l’arrêt, les tâches de démarrage, la méthode OnStart démarrer et arrêter, le démarrage, les blocages, 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 d’événements Microsoft Azure indiquant que le processus hébergeant le rôle Working n’est pas en mesure de charger l’assembly « WorkerAssembly » en raison de System. BadImageFormatException. En règle générale, lorsqu’un processus n’est pas en mesure de charger un assembly, il s’agit toujours d’une bonne pratique pour capturer les journaux de fusion. Modifiez les clés de Registre suivantes sous le chemin HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion d’accès pour activer la journalisation de la fusion. Octroyez à tout le monde l’autorisation contrôle total sur le dossier de chemin du journal de fusion C:\FusionLogs .

Capture d’écran de la modification de la clé de registre.

Lors de la vérification du journal de fusion pour « WorkerAssembly », vous pouvez obtenir plus d’informations pour résoudre les problèmes.

*** 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 ci-dessus en surbrillance 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 est liée à ce qui suit :

«Une DLL ou un exécutable est chargé en tant qu’assembly 64 bits, mais il contient des fonctions ou des ressources 32 bits. Par exemple, il s’appuie sur l’interopérabilité COM 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 la plateforme du projet   sur x86 (au lieu de x64 ou AnyCPU) et recompilez. "

Afin de déterminer le nombre de bits de l’assembly, vous pouvez exécuter n’importe quel Decompiler .NET de votre choix. Vous pouvez trouver l’assembly suivant après avoir décompilé « WorkerAssembly » à l’aide de 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é Target de la plateformedu projet « WorkerAssembly »   sur x64 (au lieu de x86 ou AnyCPU) et recompilez.

Si vous examinez le code de WorkerRole.cs pour le rôle ZipEngine, vous remarquerez que deux lignes de code étaient en train de charger l’assembly « WorkerAssembly » et d’exécuter certaines fonctions. É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();