Azure上的Asp.net MVC 5.2.2

时间:2014-10-21 15:28:24

标签: c# asp.net-mvc azure asp.net-mvc-5.2

将mvc nuget软件包从版本5.1.0升级到5.2.2后,Azure上的机器(webrole)拒绝启动Web角色。它处于回收状态。我在事件日志中发现错误:

    The description for Event ID 1007 from source Windows Azure Runtime 2.4.0.0 cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.

If the event originated on another computer, the display information had to be saved with the event.

The following information was included with the event: 

820
WaIISHost
Role entrypoint could not be created: 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=5.1.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=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

 ---> 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) 
the message resource is present but the message is not found in the string/message table

我试图通过互联网搜索,但没有有用的答案。 除了降级之外,我无法解决它。幸运的是,包版本5.1.1正在运行。

更新1: 经过一些试验和错误,我发现,asp.net mvc软件包可以达到5.1.3版本 看起来不支持5.2.0以上的软件包。

更新2: 我们决定拆分我们的网站和web.api,所以我不再有这个问题了。我最好的猜测是,确实有nuget,它引用了较旧的asp.net mvc包。

7 个答案:

答案 0 :(得分:4)

我有类似的问题。我们继承了一个项目并将ASPNET MVC版本更新为5.2.2.0。我们无法部署到Azure。我们唯一能找到的错误是你在这里提到的错误。

我们更正了每个web.config文件,因此旧版本被重定向到较新版本,但我们仍遇到同样的问题。

然后我们编写了一个小的测试方法,遍历每个Assembly,我们看到一个NuGet包仍在使用Asp.net MVC 4.0。这个包是旧版本,暂时没有更新。我下载了源代码,更新了Mvc Nuget并手动插入了dll。

我们再次部署,一切都完美无瑕。

这是测试方法。

 private void TestAssemblies()
    {
        var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        foreach (Assembly item in allAssemblies)
        {
            PrintAssembly(item);
        }
    }
    private void PrintAssembly(Assembly assembly)
    {
        foreach (var item in assembly.GetReferencedAssemblies())
        {
            if (item.FullName.Contains("System.Web.Mvc"))
            {

                Debug.WriteLine(item);
                Debug.WriteLine("Parent: " + assembly.FullName);
                Debug.WriteLine("------------------------------------------------------------");
            }
        }
    }

答案 1 :(得分:2)

MVC 5.2.2在Azure中运行得非常好。您的角色回收很可能表明您没有正确部署应用程序,或者您对绑定重定向可能无法处理的旧版MVC存在隐藏依赖关系。

我强烈建议您阅读Kevin Williamson great series on trouble shooting Azure deployments中的所有条目。

>

无法弄清楚具体发生了什么。

鉴于您发布的错误,假设您有@Yishai Galatzer提到的正确绑定重定向,您的部署中可能有一个DLL,它对MVC 5.1.0.0有隐藏的依赖关系。我建议使用像Jetbrains DotPeek这样的程序来检查包中的所有DLL并查看它们的引用。我怀疑你会发现一个本身依赖于5.1.0.0。

答案 2 :(得分:2)

I have also face similar problem with mvc5.2.2 azure deployment..

最终解决方案是我们需要添加此web.config

<dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
</dependentAssembly>``

答案 3 :(得分:1)

从它的外观来看,您似乎在web.config中缺少绑定重定向到MVC 5.2.2。这应该工作。

我们正在努力验证此方案。但是,如果这对您有用,请告诉我们。在您的web.config中,请查看以下部分,并确保它与下面的xml匹配:

<dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" /> </dependentAssembly>

答案 4 :(得分:0)

几天前我几乎有类似的问题。请参阅this帖子。 您需要将<dependentAssembly>部分添加到 WaIISHost.exe.config ,这通常是您的VM上的@ &#39; E:\ base \ x64&#39;

答案 5 :(得分:0)

很多时候我发现问题出现在〜\ Views \ Web.config文件中。它保留了对旧MVC版本的引用。只需手动更新即可。

如果不起作用,请在Sublime Text或VS以外的其他工具中对您的解决方案进行全文搜索,并搜索导致问题的版本字符串。

答案 6 :(得分:0)

我有同样的问题,它在我的Dev机器上运行良好,但在部署时我得到了程序集错误。要解决此问题,我必须将“oldVersion”从版本0.0.0.0更改为版本1.0.0.0

<dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
</dependentAssembly>

<dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
</dependentAssembly>