3

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 を配置するとすぐに、すべてが正しく開始されます。

4

2 に答える 2

1

あなたが探しているものを正確に明確にすることはできますか?質問で回答を提供し (リダイレクトを app.config に追加)、コメントの 1 つに説明へのリンクを提供します ( http://blogs.msdn.com/b/avkashchauhan/archive/2011/01 /24/dissection-of-a-windows-azure-sdk-1-3-based-asp-net-web-role-in-full-iis-mode-amp-hwc.aspx )。

あなたが見ているのは予期された動作であり、バインディング リダイレクトを app.config に追加するソリューションが正しいことを確認できます。

もう 1 つの考えられる解決策は、RoleEntrypoint コード (つまり、WebRole.cs) を変更して、AssemblyB、Version=1.0 に依存しないようにすることです。RoleEntrypoint クラスで何をしていても、IIS 内で実行されるように Application_Start から実行できますか?

于 2015-03-29T06:34:53.753 に答える
0

Azure サポート チームは、この種の問題を解決するために AzureTools を提供します。AzureTools には、Fusion Logging のオン/オフがあり、Azure ログを簡単に収集できます。

Fusion Logging を有効にすると、不足しているアセンブリに関する詳細情報を取得できます。

http://blogs.msdn.com/b/kwill/archive/2013/08/26/azuretools-the-diagnostic-utility-used-by-the-windows-azure-developer-support-team.aspx

于 2015-03-29T08:36:45.387 に答える