A função ZipEngine está presa entre o estado Reiniciando e Ocupado
Este artigo fornece informações sobre como solucionar problemas em que a função ZipEngine está presa entre o estado Reiniciando e Ocupado e lançando uma exceção informando: Não foi possível carregar o arquivo ou assembly 'WorkerAssembly - Foi feita uma tentativa de carregar um programa com um formato incorreto.
Versão original do produto: Serviço de Gerenciamento de API
Número original do KB: 4464909
Observação
Consulte o artigo sobre a Série de Solução de Problemas do Serviço de Nuvem do Azure, este é o primeiro cenário do laboratório. Certifique-se de ter seguido as instruções de configuração do laboratório para o aplicativo Compressor de acordo com isso, para recriar o problema.
Sintomas
A instância de função ZipEngine do aplicativo Compressor está constantemente em loop entre o estado Reiniciando e Ocupado, lançando a exceção sem tratamento abaixo na folha do portal do 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].
Etapas de solução de problemas
Se a sua função não for iniciada, ou se estiver reciclando os estados de inicialização, ocupado e de parada, seu código pode estar lançando uma exceção sem tratamento em um dos eventos do ciclo de vida sempre que a função é reiniciada. Portanto, se você examinar a pilha de chamadas acima com cuidado, notará que uma exceção não tratada está sendo obtida do método OnStart() de sua função de trabalho. O melhor lugar para começar a solucionar problemas para esse tipo de cenário é verificar os Logs de Eventos do Microsoft Azure que contêm a saída de diagnóstico principal do Tempo de Execução do Microsoft Azure, incluindo informações como Inicial/Interrupção da função, tarefas de inicialização, início e parada do OnStart, início do OnRun, falhas, reciclagens e assim por diante.
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()
Agora você obtém um pouco mais de detalhes sobre a exceção dos Logs de Eventos do Microsoft Azure dizendo que a função de trabalho de hospedagem de processo não é capaz de carregar o assembly 'WorkerAssembly' devido a System.BadImageFormatException. Em geral, quando um processo não é capaz de carregar um assembly, é sempre uma boa prática capturar logs do Fusion. Faça as seguintes alterações de chave do Registro no caminho HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
para habilitar o log de fusão. Conceda permissão a Todos - Controle Total para a pasta C:\FusionLogs
de caminho do log de fusão.
Ao verificar o log de fusão para 'WorkerAssembly', você pode obter mais informações para solução de problemas adicionais.
*** 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.
A mensagem de erro destacada acima nos logs de fusão afirma que algo está errado no número de bits do assembly. Se você examinar este artigo BadImageFormatException , a causa mais provável desse erro se correlaciona a isso:
"Uma DLL ou executável é carregada como um assembly de 64 bits, mas contém recursos ou recursos de 32 bits. Por exemplo, ele depende da interoperabilidade COM ou chama métodos em uma biblioteca de vínculo dinâmico de 32 bits. Para resolver essa exceção, defina a propriedade Platform target do projeto como x86 (em vez de x64 ou AnyCPU) e recompile."
Para descobrir o número de bits do assembly, você pode executar qualquer descompilador .NET de sua escolha. Você pode encontrar o assembly a seguir depois de descompilar 'WorkerAssembly' usando ILSpy.
Este é um assembly 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
O Azure é um ambiente de 64 bits. Portanto, os assemblies do .NET compilados para um destino de 32 bits não funcionarão no Azure. Para resolver essa exceção, defina a propriedade Platform target do projeto 'WorkerAssembly' como x64 (em vez de x86 ou AnyCPU) e recompile.
Se você examinar o código de WorkerRole.cs para a função ZipEngine, observará abaixo duas linhas de código que estavam realmente carregando o assembly 'WorkerAssembly' e executando alguma função. Como era um assembly de 32 bits, o WaWorkerHost.exe não conseguiu carregar esse assembly.
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.