Udostępnij za pośrednictwem


Rola ZipEngine jest zablokowana między stanem ponownego uruchomienia i zajętości

Ten artykuł zawiera informacje na temat rozwiązywania problemów, w których rola ZipEngine jest zablokowana między ponownym uruchomieniem i stanem zajętości i zgłoszeniem wyjątku z informacją: Nie można załadować pliku lub zestawu "WorkerAssembly — podjęto próbę załadowania programu z nieprawidłowym formatem.

Oryginalna wersja produktu: usługa API Management
Oryginalny numer KB: 4464909

Uwaga 16.

Zapoznaj się z artykułem Dotyczącym serii rozwiązywania problemów z usługami w chmurze platformy Azure. Jest to pierwszy scenariusz laboratorium. Upewnij się, że wykonano instrukcje konfiguracji laboratorium dotyczące aplikacji kompresora zgodnie z tym, aby odtworzyć problem.

Symptomy

Wystąpienie roli ZipEngine aplikacji kompresora stale zapętla się między ponownym uruchomieniem a stanem Zajęta zgłaszającym poniższy nieobsługiwany wyjątek w bloku witryny 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].

Kroki rozwiązywania problemów

Jeśli twoja rola nie zostanie uruchomiona lub jest odtwarzanie między stanami inicjowania, zajętości i zatrzymywania, kod może zgłaszać nieobsługiwany wyjątek w ramach jednego ze zdarzeń cyklu życia za każdym razem, gdy rola zostanie ponownie uruchomiona. Jeśli więc dokładnie przyjrzysz się powyższemu stosowi wywołań, zauważysz, że nieobsługiwany wyjątek występuje w metodzie OnStart() roli procesu roboczego. Najlepszym miejscem do rozpoczęcia rozwiązywania problemów dla tego rodzaju scenariuszy jest sprawdzenie dzienników zdarzeń platformy Microsoft Azure, które zawierają kluczowe dane wyjściowe diagnostyczne środowiska uruchomieniowego platformy Microsoft Azure, w tym informacje takie jak uruchamianie/zatrzymywanie ról, zadania uruchamiania, uruchamianie i zatrzymywanie, uruchamianie Przy uruchamianiu, awarie, odtwarzanie itd.

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()

Teraz uzyskasz nieco więcej szczegółów na temat wyjątku z dzienników zdarzeń platformy Microsoft Azure z informacją, że proces hostujący rolę procesu roboczego nie może załadować zestawu "WorkerAssembly" z powodu wyjątku System.BadImageFormatException. Ogólnie rzecz biorąc, gdy proces nie może załadować zestawu, zawsze dobrym rozwiązaniem jest przechwytywanie dzienników łączenia. Wprowadź następujące zmiany klucza rejestru w ścieżce HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion , aby włączyć rejestrowanie łączenia. Nadaj wszystkim — pełna kontrola uprawnienia do folderu C:\FusionLogsścieżki dziennika łączenia .

Zrzut ekranu przedstawia klucze rejestru w obszarze Łączenie.

Podczas sprawdzania dziennika łączenia dla elementu "WorkerAssembly" możesz uzyskać więcej informacji na temat dalszego rozwiązywania problemów.

*** 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.

Powyższy wyróżniony komunikat o błędzie w dziennikach łączenia stwierdza, że coś jest nie tak w bitowości zestawu. Jeśli przyjrzysz się temu artykułowi BadImageFormatException , najbardziej prawdopodobną przyczyną tego błędu jest skorelowanie z tym:

"Biblioteka DLL lub plik wykonywalny jest ładowany jako zestaw 64-bitowy, ale zawiera 32-bitowe funkcje lub zasoby. Na przykład opiera się na międzyoperacie MODELU COM lub wywołuje metody w 32-bitowej bibliotece linków dynamicznych. Aby rozwiązać ten wyjątek, ustaw właściwość docelową platformy projektu na wartość x86 (zamiast x64 lub AnyCPU) i ponownie skompiluj".

Aby dowiedzieć się, jaki jest bitowość zestawu, możesz uruchomić dowolny wybrany dekompiler platformy .NET. Poniższy zestaw można znaleźć po dekompilowaniu elementu "WorkerAssembly" przy użyciu metody ILSpy.

Jest to zestaw 32-bitowy (x86).

// C:\WorkerAssembly.dll
// WorkerAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Global type:
<Module>
// Architecture: x86
// Runtime: .NET 4.0

Platforma Azure to środowisko 64-bitowe. W związku z tym zestawy platformy .NET skompilowane dla 32-bitowego obiektu docelowego nie będą działać na platformie Azure. Aby rozwiązać ten wyjątek, ustaw właściwość docelową platformy projektu "WorkerAssembly" na wartość x64 (zamiast x86 lub AnyCPU) i ponownie skompiluj.

Jeśli przeglądasz kod WorkerRole.cs roli ZipEngine, zauważysz poniżej dwóch wierszy kodu, które faktycznie ładowały zestaw "WorkerAssembly" i wykonywały jakąś funkcję. Ponieważ był to zestaw 32-bitowy , WaWorkerHost.exe nie był w stanie załadować tego zestawu.

WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.