Partager via


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

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

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

Note

Reportez-vous à l’article sur la série de résolution des problèmes du service cloud Azure. Il s’agit du premier scénario du labo. Vérifiez que vous avez suivi les instructions de configuration du laboratoire pour l’application De compression en fonction de ce qui suit, pour recréer le problème.

Symptômes

L’instance de rôle ZipEngine de l’application Compresseur est en boucle constante entre l’état Restarting et Occupé qui lève l’exception non gérée 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 Initialisation, Occupé et Arrêté, votre code peut lever une exception non gérée dans l'un des événements du cycle de vie chaque fois que le rôle redémarre. Par conséquent, si vous examinez attentivement la pile des appels ci-dessus, vous remarquerez qu’une exception non gérée est effectuée à 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 à vérifier les journaux d’é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 et de démarrage, le démarrage et l’arrêt, Le démarrage OnRun, 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()

Maintenant, vous obtenez un peu plus de détails sur l’exception des journaux d’é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 les journaux Fusion. Apportez les modifications de clé de Registre suivantes sous le chemin d’accès HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion pour activer la journalisation fusion. Donnez à tout le monde l’autorisation Contrôle total sur le dossier C:\FusionLogsdu chemin du journal fusion.

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

Lors de la vérification du journal de fusion pour « WorkerAssembly », vous pouvez obtenir plus d’informations pour plus d’informations sur la résolution des 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 dans les journaux de fusion indique que quelque chose est incorrect dans le bit de l’assembly. Si vous examinez cet article BadImageFormatException , la cause la plus probable de cette erreur est corrélée à 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 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 plateforme du projet sur x86 (au lieu de x64 ou AnyCPU) et recompilez. »

Pour connaître le bit de l’assembly, vous pouvez exécuter n’importe quel décompileur .NET de votre choix. Vous trouverez peut-être l’assembly suivant après avoir décompilé « 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 fonctionneront pas sur Azure. Pour résoudre cette exception, définissez la propriété cible de plateforme 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 exécutant 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.