Asp.net MVC 5.2.2 on Azure

本文关键字:on Azure net MVC Asp | 更新日期: 2023-09-27 18:27:23

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

    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和web.api分开,所以我不再有这个问题了。我最好的猜测是,确实有nuget,它引用了旧的asp.net mvc包。

Asp.net MVC 5.2.2 on Azure

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

我们更正了每个web.config文件,以便将旧版本重定向到新版本,但我们仍然存在相同的问题。

然后我们写了一个小的测试方法,在每个Assembly上迭代,我们发现一个NuGet包仍然使用Asp.netMVC 4.0。此程序包是旧版本,有一段时间没有更新。我下载了源代码,更新了MvcNuget并手动插入了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("------------------------------------------------------------");
            }
        }
    }

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

我强烈建议您阅读Kevin Williamson关于Azure部署疑难解答的精彩系列中的所有条目。

有很多事情可能会出错,所以与其试图创建一个通用的一刀切的列表,不如查看博客文章,如果你无法弄清楚具体发生了什么,就发表评论。

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

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>``

从外观上看,您的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>

几天前我也遇到过类似的问题。请参阅这篇文章。您需要将<dependentAssembly>节添加到WaIISHost.exe.config,该节在VM上通常为@'E:''base''x64'

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

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

我遇到了同样的问题,它在我的Dev机器上运行良好,但在部署时,我遇到了汇编错误。为了解决这个问题,我不得不将"旧版本"从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>