ZipEngine 角色在重新啟動和忙碌狀態之間停滯
本文提供 ZipEngine 角色在重新啟動和忙碌狀態之間卡住的問題,以及擲回例外狀況的相關信息,指出:無法載入檔案或元件 'WorkerAssembly - 嘗試載入格式不正確的程式。
原始產品版本:API 管理 服務
原始 KB 編號: 4464909
注意
請參閱 Azure 雲端服務疑難解答系列文章,這是實驗室的第一個案例。 請確定您已依照此方式依照其指示,依照其指示來重新建立問題。
徵兆
在 [Azure 入口網站] 刀鋒視窗中擲回下列未處理例外狀況的 [重新啟動] 和 [忙碌] 狀態之間,ZipEngine 角色實例不斷迴圈:
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 事件 記錄,其中包含來自 azure 運行時間Microsoft密鑰診斷輸出,包括角色啟動/停止、啟動工作、OnStart 啟動和停止、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()
現在,您會從 Azure 事件記錄檔Microsoft取得例外狀況的詳細數據,指出進程裝載背景工作角色因 System.BadImageFormatException 而無法載入元件 'WorkerAssembly'。 一般而言,當進程無法載入元件時,擷取 Fusion 記錄一律是很好的作法。 在路徑 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
下進行下列登錄機碼變更,以啟用融合記錄。 授與所有人 - 融合記錄路徑資料夾C:\FusionLogs
的完整控制許可權。
檢查 '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.
上述融合記錄中醒目提示的錯誤訊息指出元件位發生錯誤。 如果您查看此 BadImageFormatException 文章,則此錯誤的最可能原因會與此相互關聯:
「DLL 或可執行檔會載入為64位元件,但包含32位的功能或資源。 例如,它依賴 COM Interop 或呼叫 32 位動態連結庫中的方法。 若要解決此例外狀況,請將專案的 Platform 目標 屬性設定為 x86 (而不是 x64 或 AnyCPU),然後重新編譯。
若要找出元件的位,您可以執行您選擇的任何 .NET 反編譯程式。 在使用 ILSpy 反編譯 'WorkerAssembly' 之後,您可能會發現下列元件。
這是 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 位元環境。 因此,針對 32 位元目標編譯的 .NET 組件無法在 Azure 上運作。 若要解決此例外狀況,請將 『WorkerAssembly』 專案的 Platform 目標 屬性設定為 x64 (而不是 x86 或 AnyCPU),然後重新編譯。
如果您檢閱 zipEngine 角色的WorkerRole.cs程序代碼,您會注意到下列兩行程式代碼實際上是載入元件 'WorkerAssembly' 並執行某些函式。 因為它是32位元件, 所以WaWorkerHost.exe 無法載入該元件。
WorkerAssembly.WorkerAssembly workerAssembly = new WorkerAssembly.WorkerAssembly();
workerAssembly.DoWork();
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。