13

我正在尝试在 Azure 上部署一个测试 Web 应用程序,但是当我在本地计算机上运行 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),我收到了这个错误。我的网络应用程序经常包含 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 文件的同一级别,并且将其复制到输出目录属性设置为“始终复制”。当然,此配置文件包含我上面描述的绑定重定向部分。

于 2013-03-05T16:41:00.587 回答
2

到今天为止,使用最新的 SDK 会自动为您生成一个 WebRoleProjectName.dll.config,其中包含 Web.config 的内容并复制到输出目录。

但是,这不会自动包含在部署包中!为此,您必须采用一种骇人听闻的解决方案:通过选择“显示所有文件”将生成的文件包含在项目中,然后仅包含此文件。csproj 中的结果更改应如下所示(不是,不要将其选择为“始终复制”!):

<Content Include="bin\WebRoleProjectName.dll.config" />
于 2014-09-02T00:10:15.713 回答