Роль ZipEngine зависает между состоянием "Перезапуск" и "Занят"
В этой статье содержатся сведения об устранении неполадок, в которых роль ZipEngine зависает между состоянием перезапуска и занятой и создает исключение: не удалось загрузить файл или сборку WorkerAssembly . Попытка загрузить программу с неправильным форматом.
Исходная версия продукта: служба Управление API
Исходный номер базы знаний: 4464909
Примечание.
Ознакомьтесь со статьей по серии устранения неполадок облачной службы Azure, это первый сценарий лаборатории. Убедитесь, что вы выполнили инструкции по настройке лаборатории для приложения "Компрессор", чтобы воссоздать проблему.
Симптомы
Экземпляр роли ZipEngine приложения "Компрессор" постоянно цикличен между перезапуском и состоянием "Занят", вызывая следующее необработанное исключение в колонке портал 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].
Действия по устранению неполадок
Если ваша роль не запускается или зацикливается между состояниями инициализации, занятости и остановки, возможно ваш код вызывает необработанное исключение в одном из событий жизненного цикла при каждом перезапуске роли. Поэтому при внимательном просмотре стека вызовов выше вы заметите, что необработанное исключение выполняется из метода OnStart() рабочей роли. Лучше всего начать устранение неполадок для таких сценариев, как проверка журналов событий Microsoft Azure, содержащих ключевые диагностические выходные данные среды выполнения Microsoft Azure, включая сведения, такие как запуск и остановка роли, задачи запуска, запуск и остановка OnRun, запуск OnRun, сбои, перезапуски и т. д.
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()
Теперь вы получите немного больше сведений об исключении из журналов событий Microsoft Azure, заявив, что процесс размещения рабочей роли не может загрузить сборку WorkerAssembly из-за System.BadImageFormatException. Как правило, если процесс не может загрузить сборку, рекомендуется записывать журналы Fusion. Внесите следующие изменения в раздел реестра, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
чтобы включить ведение журнала fusion. Предоставьте всем разрешение на полный доступ к папке C:\FusionLogs
пути журнала fusion.
При проверке журнала слияния для WorkerAssembly вы можете получить дополнительные сведения для дальнейшего устранения неполадок.
*** 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.
Приведенное выше сообщение об ошибке в журналах fusion указывает, что что-то не так в бите сборки. Если вы изучите эту статью BadImageFormatException , то наиболее вероятной причиной этой ошибки является следующее:
"Библиотека DLL или исполняемый файл загружается в виде 64-разрядной сборки, но содержит 32-разрядные функции или ресурсы. Например, он зависит от com-взаимодействия или вызовов методов в 32-разрядной библиотеке динамических ссылок. Чтобы устранить это исключение, задайте целевому свойству платформы проекта значение x86 (вместо x64 или AnyCPU) и перекомпилируйте".
Чтобы узнать битность сборки, можно запустить любой декомпилатор .NET. Вы можете найти следующую сборку после декомпиляции WorkerAssembly с помощью ILSpy.
Это 32-разрядная сборка (x86).
// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0
Azure является 64-разрядной средой. Таким образом, сборки .NET, скомпилированные для 32-разрядной среды, не будут работать в Azure. Чтобы устранить это исключение, задайте целевое свойство платформы платформы проекта WorkerAssembly значение x64 (вместо x86 или AnyCPU) и перекомпилируйте.
Если вы просмотрите код WorkerRole.cs для роли ZipEngine, обратите внимание на две строки кода, которые фактически загружали сборку WorkerAssembly и выполняли некоторые функции. Так как это была 32-разрядная сборка , WaWorkerHost.exe не удалось загрузить такую сборку.
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.