El rol ZipEngine se bloquea entre el estado Restarting (Reinicio) y Busy (Ocupado)
En este artículo se proporciona información sobre la solución de problemas en los que el rol ZipEngine se bloquea entre el estado Reinicio y Ocupado y se produce una excepción que indica: No se pudo cargar el archivo o ensamblado "WorkerAssembly: se intentó cargar un programa con un formato incorrecto.
Versión original del producto: API Management Service
Número de KB original: 4464909
Nota:
Consulte el artículo sobre la serie de solución de problemas de Azure Cloud Service; este es el primer escenario del laboratorio. Asegúrese de que ha seguido las instrucciones de configuración del laboratorio para la aplicación Compressor según esto, para volver a crear el problema.
Síntomas
La instancia de rol ZipEngine de la aplicación Compressor está en bucle constantemente entre el estado Restarting (Reinicio) y Busy (Ocupado), lo que genera la siguiente excepción no controlada en la hoja Azure Portal:
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].
Pasos para solucionar problemas
Si el rol no se inicia o se recicla entre los estados de inicialización, ocupado y detención, es posible que el código genere una excepción no controlada dentro de uno de los eventos del ciclo de vida cada vez que se reinicie el rol. Por lo tanto, si examina cuidadosamente la pila de llamadas anterior, observaría que se está realizando una excepción no controlada desde el método OnStart() del rol de trabajo. El mejor lugar para comenzar la solución de problemas para este tipo de escenarios es comprobar los registros de eventos de Microsoft Azure que contienen la salida de diagnóstico clave de Microsoft Azure Runtime, incluida la información como inicios o detenciones de roles, tareas de inicio, inicio y detención de Inicio, Inicio de la ejecución, bloqueos, reciclajes, 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()
Ahora obtendrá un poco más de detalle sobre la excepción de los registros de eventos de Microsoft Azure que indica que el rol de trabajo de hospedaje de procesos no puede cargar el ensamblado "WorkerAssembly" debido a System.BadImageFormatException. En general, cuando un proceso no puede cargar un ensamblado, siempre es recomendable capturar registros de Fusion. Realice los siguientes cambios de clave del Registro en la ruta de acceso HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
para habilitar el registro de Fusion. Conceda permiso a todos: control total a la carpeta C:\FusionLogs
de ruta de acceso del registro de fusion.
Al comprobar el registro de fusión para "WorkerAssembly", puede obtener más información para solucionar problemas adicionales.
*** 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.
El mensaje de error resaltado anteriormente en los registros de fusión indica que hay algún error en la bitness del ensamblado. Si examina este artículo de BadImageFormatException , la causa más probable de este error se correlaciona con esto:
"Un archivo DLL o ejecutable se carga como un ensamblado de 64 bits, pero contiene características o recursos de 32 bits. Por ejemplo, se basa en la interoperabilidad COM o llama a métodos en una biblioteca de vínculos dinámicos de 32 bits. Para solucionar esta excepción, establezca la propiedad de destino platform del proyecto en x86 (en lugar de x64 o AnyCPU) y vuelva a compilar".
Para averiguar el bitness del ensamblado, puede ejecutar cualquier descompilador de .NET que prefiera. Es posible que encuentre el siguiente ensamblado después de descomponer "WorkerAssembly" mediante ILSpy.
Se trata de un ensamblado de 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 es un entorno de 64 bits. Por lo tanto, los ensamblados de .NET compilados para un destino de 32 bits no funcionarán en Azure. Para solucionar esta excepción, establezca la propiedad de destino de plataforma del proyecto "WorkerAssembly" en x64 (en lugar de x86 o AnyCPU) y vuelva a compilar.
Si revisa el código de WorkerRole.cs para el rol ZipEngine, observaría debajo de dos líneas de código que realmente cargaban el ensamblado "WorkerAssembly" y realizaban alguna función. Dado que era un ensamblado de 32 bits, el WaWorkerHost.exe no pudo cargar ese ensamblado.
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
Ponte en contacto con nosotros para obtener ayuda
Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.