2013-05-21 28 views
5

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

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文件中,应绘制它下面的,但它似乎并没有被 -

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

*** 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:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 
Running under executable c:\windows\system32\inetsrv\w3wp.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = IIS APPPOOL\ASP.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:\Work\Webs\SSUApp\SSUApp\bin 
LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\lssapp\7a6e6cde 
LOG: Cache Base = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\lssapp\7a6e6cde 
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:\Windows\assembly\NativeImages_v4.0.30319_64\System.Web.Mvc\f234ba2bcf5f845279e46dc04198a7cd\System.Web.Mvc.ni.dll. 
Rejecting code sharing because a dependent assembly did not match the conditional APTCA share mode 
Native image successfully used. 

任何想法都会摇摆不定,因为我已经在这上面烧了一大堆小时。

感谢, 弗朗西斯

回答

11

手动将一组MVC3项目升级到MVC4后,我有一个非常类似的程序集绑定问题。尽管在web.config中有组件绑定元素,但我得到的错误类似于T4MVC错误,但来自Telerik MVC Extensions。

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

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

所以,在web.config是这样的:

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

和删除它看起来像这样的命名空间之后:

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

此博客帖子大约有错误的命名空间的更多信息: http://www.dotnetish.com/runtime/xmlnshttpschemas-microsoft-com-netconfigurationv2-0/

+1

你先生,赢了!这正是它的原因。非常感谢。 –

0

隔离开来,我会尝试创建是建立针对MVC3,看它是否同样表现一个微小的仿制组件。 T4MVC辅助组件不应有任何特殊之处。

另外,请看我的测试项目https://github.com/davidebbo/T4MVCSampleApp。这是一个使用最新T4MVC的MVC4项目,它对我来说运行良好。它会为你运行吗?

如果一切都失败了,如果你可以共享一个repro项目(例如在github上),我可以试着看看。

+0

谢谢你的回应大卫,我试过隔离,当然它的工作完美。事实上,我甚至已经在我的解决方案中开始了一个新的Web应用程序项目,并且它也完全重新绑定。由于我提交了bug,我也遇到了与更新的WebGrease.dll相同的问题,所以我认为T4MVCExtension在这种情况下是完全无辜的,我相信这只是我项目web.config中的错误配置。 顺便说一句 - 我喜欢T4MVC,这是一个非常棒的除了框架,并真正采用MVC的猜测工作。非常感谢。 –

+0

刚刚看到上面的解决方案。很高兴工作! –

相关问题