AssemblyBinding BindingRedirect 不适用于具有 T4MVCExtensions 的 MVC4 应用程序 [英] AssemblyBinding BindingRedirect not working for MVC4 app with T4MVCExtensions

查看:20
本文介绍了AssemblyBinding BindingRedirect 不适用于具有 T4MVCExtensions 的 MVC4 应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个使用 T4MVC 的大型 .NET Web 应用程序,即 MVC3.我们最近将它升级到 MVC4,除了 T4MVCExtensions(来自 NuGet 的 3.6.5 版)仍然依赖于 System.Web.Mvc 版本 3 之外,一切都很好.您应该在 web.config 中设置的运行时依赖项应该正在重定向程序集绑定,但它们似乎不是.出现以下异常:

We have a large .NET web application that was MVC3, using T4MVC. We recently upgraded it to MVC4, and all is good except for T4MVCExtensions (version 3.6.5 from NuGet) is still dependent on System.Web.Mvc version 3. The runtime dependencies that you're supposed to setup in the web.config SHOULD be redirecting the assembly bindings, but they don't seem to be. The following exception occurs:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Description: An unhandled exception occurred during the execution of the current web     request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

我们的 web.config 文件中有以下内容,应该映射它,但它似乎不是 -

We've got the following in our web.config file, which should be mapping it, but it doesn't seem to be -

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers"
                      publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc"
                      publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages"
                      publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

我启用了融合日志,只是为了验证我的疯狂,并且看到,确实,它似乎确实在尝试使用 mvc3 二进制文件,而不是 4:

I've enabled the fusion log, just to verify my craziness really, and see that, yes indeed, it does seem to be trying to use the mvc3 binary, and not going to 4:

*** Assembly Binder Log Entry  (5/21/2013 @ 3:37:23 PM) ***

The operation failed.
Bind result: hr = 0x80004005. Unspecified error

Assembly manager loaded from:  C:WindowsMicrosoft.NETFramework64v4.0.30319clr.dll
Running under executable  c:windowssystem32inetsrvw3wp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = IIS APPPOOLASP.NET v4.0
LOG: DisplayName = System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///C:/Work/Webs/SSUApp/SSUApp/
LOG: Initial PrivatePath = C:WorkWebsSSUAppSSUAppin
LOG: Dynamic Base = C:WindowsMicrosoft.NETFramework64v4.0.30319Temporary ASP.NET Fileslssapp7a6e6cde
LOG: Cache Base = C:WindowsMicrosoft.NETFramework64v4.0.30319Temporary ASP.NET Fileslssapp7a6e6cde
LOG: AppName = d5bcf9a8
Calling assembly : App_Web__managerulespartial.cshtml.38bccb18.jb5ozz39, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: Start validating all the dependencies.
LOG: [Level 1]Start validating native image dependency mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
LOG: [Level 1]Start validating IL dependency System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: [Level 1]Start validating IL dependency System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a.
LOG: [Level 1]Start validating native image dependency System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
LOG: [Level 1]Start validating native image dependency System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
LOG: [Level 1]Start validating IL dependency System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: [Level 1]Start validating IL dependency System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: [Level 1]Start validating IL dependency System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: [Level 1]Start validating IL dependency System.Runtime.Caching, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a.
LOG: [Level 1]Start validating IL dependency Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: [Level 1]Start validating IL dependency System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: [Level 1]Start validating IL dependency System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
LOG: [Level 1]Start validating IL dependency System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
LOG: [Level 1]Start validating IL dependency System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
Native image has correct version information.
LOG: Validation of dependencies succeeded.
LOG: Bind to native image succeeded.
Attempting to use native image C:WindowsassemblyNativeImages_v4.0.30319_64System.Web.Mvcf234ba2bcf5f845279e46dc04198a7cdSystem.Web.Mvc.ni.dll.
Rejecting code sharing because a dependent assembly did not match the conditional APTCA share mode
Native image successfully used.

任何想法都会动摇,因为我已经为此花费了大量时间.

Any ideas would rock, since I've already burned a bunch of hours on this.

谢谢,弗朗西斯

推荐答案

在手动将一组 MVC3 项目升级到 MVC4 后,我遇到了非常相似的程序集绑定问题.尽管在 web.config 中有程序集绑定元素,我还是收到了与 T4MVC 错误类似的错误,但来自 Telerik MVC 扩展.

I had a very similar assembly binding issue, after manually upgrading a set of MVC3 projects to MVC4. Despite having the assembly binding elements in web.config, I was getting errors similar to T4MVC errors but from the Telerik MVC Extensions.

Fusion Log 查看器很有用,因为它确认了两个版本的 system.web.mvc 正在加载到应用程序域中.

The Fusion Log viewer was useful as it confirmed that two versions of system.web.mvc were being loaded into the application domain.

最后,从项目根 web.config 的根配置元素中删除命名空间解决了这个问题.

In the end, removing the namespace from the root configuration element in the project's root web.config resolved the issue.

所以,web.config 是这样的:

So, the web.config was like this:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<!--... elements deleted for clarity ...-->
</configuration>

删除命名空间后,它看起来像这样:

And after removing the namespace it looks like this:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--... elements deleted for clarity ...-->
</configuration>

这篇博文提供了有关错误命名空间的更多信息:http://www.dotnetish.com/runtime/xmlnshttpschemas-microsoft-com-netconfigurationv2-0/

This blog post has more information about the erroneous namespace: http://www.dotnetish.com/runtime/xmlnshttpschemas-microsoft-com-netconfigurationv2-0/

这篇关于AssemblyBinding BindingRedirect 不适用于具有 T4MVCExtensions 的 MVC4 应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆