El rol ZipEngine está bloqueado entre el estado Reinicio y Ocupado
En este artículo se proporciona información sobre cómo solucionar problemas en los que el rol ZipEngine está bloqueado entre el estado Reinicio y Ocupado y se produce una excepción que indica: No se pudo cargar el archivo o el ensamblado "WorkerAssembly: se intentó cargar un programa con un formato incorrecto.
Versión original del producto: servicio API Management
Número de KB original: 4464909
Nota:
Consulte el artículo sobre la serie de solución de problemas del servicio en la nube de Azure, este es el primer escenario del laboratorio. Asegúrese de que ha seguido las instrucciones de configuración del laboratorio para la aplicación Compresor según esto, para volver a crear el problema.
Síntomas
La instancia de rol ZipEngine de la aplicación Compresor se repite constantemente entre reiniciar y estado ocupado , lo que produce la siguiente excepción no controlada en la hoja de 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 de solución de problemas
Si el rol no se inicia, o se recicla entre los estados de inicialización, ocupado y detención, el código puede generar una excepción no controlada en uno de los eventos de ciclo de vida cada vez que se reinicie el rol. Por lo tanto, si examina detenidamente 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 empezar a solucionar problemas de este tipo de escenarios es comprobar los registros de eventos de Microsoft Azure que contengan la salida de diagnóstico clave de Microsoft Azure Runtime, incluida información como inicio y detención de roles, tareas de inicio y de inicio, OnStart, OnRun start, crashes, recycles, 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 detalles sobre la excepción de los registros de eventos de Microsoft Azure que indican 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 en la clave del Registro en la ruta HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
de acceso para habilitar el registro de fusión. Conceda a todos los usuarios el permiso Control total a la carpeta C:\FusionLogs
de ruta de acceso del registro de fusión .
Al comprobar el registro de fusión de "WorkerAssembly", es posible que obtenga más información para obtener más información para solucionar problemas.
*** 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 anterior en los registros de fusión indica que algo está mal en el bit 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 valor de bits del ensamblado, puede ejecutar cualquier descompilador de .NET de su elección. Es posible que encuentre el siguiente ensamblado después de descompilar "WorkerAssembly" mediante ILSpy.
Este es 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 platform 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 las siguientes dos líneas de código que realmente cargaban el ensamblado "WorkerAssembly" y realizan alguna función. Puesto 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.