安装 ASP.NET MVC 4 Beta 后出现 InvalidCastException 异常

82
在安装ASP.NET MVC 4 Beta到一个已经有ASP.NET MVC 3的机器后,我遇到了以下异常:
System.InvalidCastException was unhandled by user code Message=[A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'. Type B originates from 'System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'. Source=System.Web.WebPages.Razor 这个异常完全阻止了我的工作,虽然我希望继续使用这个beta版本,但我可能需要将其完全卸载以解决此异常。

1
你是否碰巧在运行 .NET 4.5 开发预览版?(那个版本与当前的 Beta 版本不兼容)(仅供记录,不是我给问题投反对票,这个问题是合法的) - Michael Stum
1
不,我根本不运行4.5。 - Nikos Baxevanis
3
为什么这个被踩了?我提供了一些反馈,希望对其他人有所帮助。 - Nikos Baxevanis
@MichaelStum 没关系,不用担心。 :) - Nikos Baxevanis
抱歉造成困惑。我本来想要“收藏”这个问题,但误点了一下 =P 已经取消了踩的操作,并且这次已经成功地添加了收藏。 - Josh Darnell
@jadarnel27 没问题。:) 我会尝试找出为什么在运行时选择 v2.0.0.0 而不是 v1.0.0.0 .. :( - Nikos Baxevanis
9个回答

101

我曾经遇到过同样的问题,当时是在将ASP.NET MVC 3迁移到ASP.NET MVC 4时出现的。我在这个问题上花费了一些时间。

我找到了解决方案,但它的来源不同,它不是来自于WebPages版本。

我遵循了官方指南(可以这么说)将ASP.NET MVC 3项目升级到ASP.NET MVC 4

为了解决这个问题,你需要在Web.Config文件中添加以下内容(可能在之前加入的代码附近):

<runtime><!-- Should be there by default, near end -->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><!-- Should be there by default -->
    <dependentAssembly>..</dependentAssembly><!-- Should be there by default -->
        ... some other dependecy redirects ...

    <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor"
            publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
    </dependentAssembly>

        ... some other dependency redirects ...
    </assemblyBinding>
</runtime>

笔记中也没有提到将System.Web.Helpers的引用从1.0.0.0更改为2.0.0.0(删除并添加新版本)。


2
+1 感谢你的分享。我做了一个小变化,就是使用 oldVersion="1.0.0.0-2.0.0.0",只是为了遵循 MVC4 项目模板中使用的约定。有趣的是,在 MVC4 项目模板的根 Web.config 中也没有找到 System.Web.WebPages.RazordependentAssembly - Scotty.NET
1
我曾经遇到过类似的问题,尝试将MVC 4 NuGet包更新至5.1.1版本时出现了问题。不过,上述代码可以解决该问题,其中 oldVersion="2.0.0.0" newVersion="3.0.0.0" 需要注意。 - Luke Puplett

34

还有一个比较晚的解决方案...我遇到了同样的问题。做了这里列出的所有修复措施(非常感谢大家!),但是仍然无法解决错误。最终,我在Views目录中找到了一个web.config文件,在这个文件中,我发现了几个对System.Web.Mvc版本的引用,并将它们全部升级到了“4.0.0.0”版本。更重要的是,我找到了以下行,并将“system.web.webPages.Razor”的版本号从“1.0.0.0”更新为“2.0.0.0”,突然间,一切都重新开始工作了。希望这会对其他人有所帮助。

<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>

史蒂夫·G.


1
如果您正在使用区域(Areas),请不要忘记在Areas/Views下考虑web.config。 - Antonin Jelinek

32
尝试在您的web.config文件中添加以下内容:
<appSettings>
  <add key="webpages:Version" value="1.0.0.0"/>
</appSettings>
问题可能是由于注册了多个构建提供程序且最新的获胜而引起的。

5
我找到了另一种使这个工作的方法,是通过台湾博客上关于从MVC 2升级到MVC 3的方式: http://blog.kkbruce.net/2011_04_01_archive.html (你可以在IE10中使用Microsoft Translate查看英文版本,它翻译得相当不错...)
诀窍在于找到与MVC3相关的所有版本(例如Razor、Mvc、Helper assemblies,在引用中查看所有更新的引用程序集时,您将知道它们是什么)并将它们从1.0.0.0改为2.0.0.0,将3.0.0.0改为4.0.0.0(因为公钥相同)。根据博客中的提示,您还可以尝试删除版本。
另一个重要的事情是,这些设置都在所有的Web.Config中。所以不仅仅在根目录下,在View、Area/{Area}/View等地方都有。
我觉得这个解决方案可以让您完全升级到MVC4,而不是拥有一个混合版,这对我来说也行不通。

4
  1. 在Visual Studio中,创建一个新的“抛弃式”ASP.NET MVC 4应用程序,并将其放置在另一个文件夹中。
  2. 用新创建的“抛弃式”应用程序中的Views web.config文件替换你的Views文件夹中的web.config文件。

你会注意到:

System.Web.WebPages.RazorVersion=1.0.0.0变成了Version=2.0.0.0 System.Web.MvcVersion=3.0.0.0变成了Version=4.0.0.0


3
如果你遇到了这个问题,并且尝试了以上的解决方案还没有解决,那么请查看你Views文件夹中的web.config。可能会有一些配置与你App根目录下的Web.config文件发生冲突。

0

为了完整起见...

如果您不使用Web页面,也可以将其全部关闭。

<appSettings>
    <add key="webpages:Enabled" value="false" />
</appSettings>

(虽然我对 Razor 视图和 Web 页面之间的关系还不太清楚,但似乎我的 MVC 应用程序使用 Razor 视图在禁用 Web 页面的情况下仍然可以正常工作。)

0

最后一步,还要清理项目中引发错误的 bin 文件夹。


0

你的一些代码正在当前MVC位上运行,而其他代码已经推送到了更新的版本。如果不了解代码,我无法告诉您哪个具体部分导致了问题。

话虽如此,我永远不会在生产开发机器上设置beta版。现在创建虚拟机非常容易,并在镜像上运行beta版。在Windows 7+中,如果需要(通常需要dev工具beta),您可以从金属上启动映像而不会受到性能影响。


是的,但这个Beta版有一个上线许可证。毕竟,它只是在虚拟机上运行,但虚拟机也有ASP.NET MVC 3。 - Nikos Baxevanis
你需要确定3中的哪一位正在4中运行,因为这就是你遇到冲突的地方。在Web Forms转入.NET 2时期,同样的情况发生了很多次,并且对于任何附加组件(如MVC?)都是一个相当大的问题。 - Gregory A Beamer
实际上,这是一个非常大的ASP.NET MVC 3项目。没有任何东西在4中运行。我无法启动3个项目,这就是全部。在appSettings元素中添加<add key="webpages:Version" value="1.0.0.0"/>解决了它。 - Nikos Baxevanis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接