Web ロールの起動で奇妙な問題が発生しました。完全な再現は非常に複雑ですが、根本的な原因を見つけることができたので、簡略化した手順を記載します。
私の Webrole プロジェクトは AssmeblyA に依存しており、AssmeblyA は AssemblyB、Version=1.0 に依存しています。webrole も AssemblyB に直接依存していますが、Version=2.0 です。(これはすべて、私が制御できないさまざまな NuGet パッケージからのものです)。
最後に、AssemblyB、Version=2.0 が \Bin フォルダーにコピーされます。Web.config には、AssemblyB から Version=2.0 へのバインド リダイレクトがあるため (これは、nuget クライアントによって自動的に配置されます)、Web サイト自体は正しく機能しています。
ただし、webrole を Azure にデプロイすると、AssemblyB、Version=1.0 を読み込めないため、開始に失敗します。
これは、web.config が影響を与えない Approot ディレクトリから Web ロールが最初に読み込まれるためだと思われます。また、web-role の app.config も生成し、そこにすべてのバインディング リダイレクトを複製することで、この問題を回避できることもわかりました。これは機能しますが、そのような設定を維持するのはあまり便利ではありません。
これが Azure Web ロールの既知の問題であるかどうかを知っている人はいますか?
Azure SDK 2.4 および 2.5.1 で試してみました。すべての azure nuget パッケージは最新で、カスタム スタートアップ コードは一切ありません。
更新: IntelliTrace を介して取得された例外は次のとおりです。
次の例外のため、ロール エントリ ポイントを読み込めません: -- System.IO.FileLoadException:
ファイルまたはアセンブリ 'Microsoft.Owin, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' またはその依存関係の 1 つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULT からの例外: 0x80131040) ファイル名: 'Microsoft.Owin、Version=3.0.0.0、Culture=neutral、PublicKeyToken=31bf3856ad364e35'
そして、ここにスタックトレースがあります:
CommonLanguageRuntimeLibrary!System.Reflection.RuntimeModule.GetTypes()
CommonLanguageRuntimeLibrary!System.Reflection.Assembly.GetTypes()
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(System.Reflection.Assembly entryPointAssembly = {System.Reflection.RuntimeAssembly})
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleTypeEnum = IISWeb)
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleTypeEnum = IISWeb)
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRole(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleType = IISWeb)
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.AnonymousMethod()
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown})
CommonLanguageRuntimeLibrary!System.Threading.ThreadHelper.ThreadStart()
エラーが発生するのは、Web ロール プロジェクトが Owin Version=3.0.1.0 に依存しているのに、別の DLL (nuget を介して取得) が Owin Version=3.0.0.0 に依存しているためです。したがって、マニフェストの不一致。
そのため、RoleEntryPoint があるかどうかを確認するためだけに、サービス ランタイムがまだアセンブリを WaIISHost.exe にロードしているようです (私はありません)。前と同じように、web.config から E:\approot\bin にコピーされたバインディング リダイレクトを含む myassembly.dll.config を配置するとすぐに、すべてが正しく開始されます。