13

テスト Web アプリを Azure にデプロイしようとしていますが、ローカル マシンで Azure エミュレーターを実行すると、WebRole に接続されている Azure エミュレーター コンソールから次のエラーが表示されます。

System.TypeLoadException: Unable to load the role entry point due to the following     exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

=== Pre-bind state information ===
LOG: User = COLLAB\mirko.lugano
LOG: DisplayName = System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
(Fully-specified)
LOG: Appbase = file:///C:/Code/Application/<MyWebProject>.Azure/csx/Debug/roles/<MyWebProject>/approot/bin
LOG: Initial PrivatePath = C:\Code\Application\<MyWebProject>.Azure\csx\Debug\roles\<MyWebProject>\approot\bin
Calling assembly : ActionMailer.Net.Mvc, Version=0.7.4.0, Culture=neutral, PublicKeyToken=e62db3114c02a1c2.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\Application\<MyWebProject>.Azure\csx\Debug\roles\<MyWebProject>\base\x64\WaIISHost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL file:///C:/Code/Application/<MyWebProject>.Azure/csx/Debug/roles/<MyWebProject>/approot/bin/System.Web.Mvc.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

---> System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
  at System.Reflection.RuntimeModule.GetTypes()
  at System.Reflection.Assembly.GetTypes()
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly entryPointAssembly)
  --- End of inner exception stack trace ---
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly entryPointAssembly)
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(RoleType roleTypeEnum)
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
[fabric] Role state Unknown

ローカル マシンに MVC3 がインストールされている (MVC3 アセンブリが GAC にある) 限り、すべて正常に機能していましたが、MVC3 を削除したため (Azure には MVC がインストールされていません)、このエラーが発生しています。私の Web アプリには MVC4 が定期的に含まれており、正常に動作します。次に、アセンブリ バインディングのリダイレクトについて考えていたところ、web.config ファイルに次のものが既にあることに気付きました。

  <runtime>    
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">      
    ...
    <dependentAssembly>        
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    ...
  </assemblyBinding>
</runtime>

私がインターネットで読んだドキュメントによると、これはすでに正しいはずです。また、 (バージョン 4.0.0.0 )のSpecificVersionプロパティをfalseに設定しようとしましたが、役に立ちませんでした。何か不足していますか?呼び出し元のアセンブリは、正しいバージョンの MVC アセンブリに自動的にリダイレクトされるべきではありませんか? どんなアイデアでも大歓迎です。ありがとう。System.Web.Mvc.dllActionMailer.Net.Mvc

4

3 に答える 3

11

Azure WebRoles では、デフォルトで (フル IIS モード)、RoleEntryPoint は WebRole の残りの部分から隔てられ、別のプロセスで実行されます。

これの副作用は、RoleEntryPoint がweb.configにアクセスできないことです。

  • Azure SDK 1.3 -1.7 はWaIISHost.exe.configを参照します

  • Azure SDK 1.8+ は WebRoleProjectName.dll.config を調べます

SDK への最新の変更により、 app.configをプロジェクトに配置できるようになり、ロール エントリ ポイントがそれにアクセスできるようになります。

詳細については、この Microsoftブログの投稿またはこのStackoverflow の投稿を参照してください。

于 2013-03-05T15:43:30.183 に答える
5

ルネさん、貴重なヒントをありがとうございます。それは私の問題を解決しませんでしたが、私は最新バージョンの Azure SDK (1.8) を使用しており、この WaIISHost.exe.config トリックは最新バージョンの Azure では機能しなくなったため、正しい方向を示してくれました。ここに、私が今言ったことと、私のために働いた解決策が記載されています。これは、WaIISHost.exe.config ファイルの名前を MyWebAppName.dll.config に変更することです (Web アプリの web.config ファイルと同じレベルに配置しその Copy to output Directory プロパティを 'Copy Always' に設定します もちろん、この構成ファイルには、上で説明したバインディング リダイレクト セクションが含まれています。

于 2013-03-05T16:41:00.587 に答える