在安装ASP.NET MVC 4 Beta之后引发InvalidCastException

在使用ASP.NET MVC 3的机器上安装ASP.NET MVC 4 Beta之后,我得到以下exception。

System.InvalidCastException由用户代码未处理消息= [A] System.Web.WebPages.Razor.Configuration.HostSection不能转换为[B] System.Web.WebPages.Razor.Configuration.HostSection。 typesA来源于位于“C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System”上下文“Default”中的“System.Web.WebPages.Razor,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35” .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll”。 typesB来源于'System.Web.WebPages.Razor,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35',位置为'C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_2.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll”。 来源= System.Web.WebPages.Razor

堆栈跟踪:

在System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection(stringvirtualPath)在System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(stringvirtualPath,stringphysicalPath)在System.Web.WebPages.Razor.RazorBuildProvider.GetHostFromConfig()at System.Web.WebPages.Razor.RazorBuildProvider.CreateHost()在System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode()在System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType()在System.Web.Compilation.BuildProvider。在System.Web.Compilation的System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProvider()处的System.Web.Compilation.BuildProvidersCompiler.PerformBuild()处的System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)处的GetCompilerTypeFromBuildProvider(BuildProvider buildProvider) BuildManager.GetVPathBuildResultInternal(虚拟pathvirtualPath,布尔noBuild,布尔allowCrossApp,布尔allowBuildInPrecompile,布尔throwIfNotFound,布尔ensureIsUpToDate)一个 在System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext context,Boolean)中创buildSystem.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext上下文,VirtualPath virtualPath,布尔noBuild,布尔allowCrossApp,布尔allowBuildInPrecompile,布尔throwIfNotFound,布尔ensureIsUpToDate)在System.Web.Mvc上System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(stringvirtualPath)System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext,stringvirtualPath)上的allowCrossApp,布尔throwIfNotFound) .VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext,List`1 locations,String name,String controllerName,String areaName,String cacheKey,String []&searchingLocations)at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext,String [] locations, String [] areaLocations,String locationsPropertyName,S 在System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext控制器上下文,string视图名,stringmasterName,布尔useCache)在System.Web.Mvc.ViewEngineCollection tring名字,string控制器名称,stringcacheKeyPrefix,布尔useCache,string[]和SearchingLocations)。 System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext,String viewName,String masterName)在System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup,Boolean trackSearchedPaths)上的c__DisplayClassc.b__b(IViewEngine e)在System.Web.Mvc的System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult)上的System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext上下文)中的.Web.Mvc.ViewResult.FindView(ControllerContext上下文) ControllerActionInvoker。<> c__DisplayClass1c.b__19()at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter,ResultExecutingContext preContext,Fun (System.Web.Mvc.ControllerActionInvoker)上的System.Web.Mvc.ControllerActionInvoker <c__DisplayClass1c。<> c__DisplayClass1e.b__1b()在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1 filters,ActionResult actionResult)。 Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)System.Web.Mvc.Controller.ExecuteCore()at [project_namespace] .Controllers.GlobalizationController.ExecuteCore()in [file_path] System.Web.Mvc.ControllerBase System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)在System.Web.Mvc.MvcHandler .Execute(RequestContext requestContext)<> c__DisplayClass6。<> c__DisplayClassb.b__5()at System在System.Web.Mvc.Async.AsyncResultWrapper。<> c__DisplayClass8`1.b__7(IAsyncResult _)System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult < `1.End()在System.Web.Mvc.MvcHandler 。System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)上的System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)上System.Web.Mvc.SecurityUtil.b__0(Action f)处的c__DisplayClasse.b__d()在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()上的System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)System.Web.HttpApplication.ExecuteStep(IExecutionStep一步,布尔&完成同步)

这完全阻止了我,而我想保持testing版,我可能需要完全删除它,以摆脱例外。

尝试在您的web.config中添加以下内容:

<appSettings> <add key="webpages:Version" value="1.0.0.0"/> </appSettings> 

这个问题可能是由于多个构build提供商正在注册以及最新的获胜。

我有同样的问题,但是当将ASP.NET MVC 3迁移到ASP.NET MVC 4.这样我就得到了这个主题。 我已经find了解决这个问题的办法,但是它的来源不同,不是来自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的Reference从1.0.0.0更改为2.0.0.0(删除并添加新的)。

还有一个,相当晚,解决scheme…我遇到了同样的问题。 在这里列出了所有的修正(谢谢大家!!!),但无法通过错误。 最后,无奈之下,我在Views目录中find了一个web.config文件。 在这个文件中,我发现了几个对System.Web.Mvc版本的引用,并把它们都撞到了“4.0.0.0”。 更重要的是,我find了以下几行,并将“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> 

Steve G.

我find了另外一种方法来实现这个function,沿着从MVC 2升级到MVC 3的台湾的博客: http : //blog.kkbruce.net/2011_04_01_archive.html (你可以在IE10中使用微软的翻译英文版,这是一个相当不错的翻译…)

诀窍是find与MVC3相关的所有版本(例如Razor,Mvc,Helper程序集,如果你去参考并查看引用程序集的所有更新版本,你将会知道它们是什么),并将它们从1.0.0.0到2.0.0.0和从3.0.0.0到4.0.0.0(因为公钥是相同的)。 您也可以尝试按照博客删除版本。

另一个重要的是这些设置都在Web.Configs中。 所以不仅在你的根下,而且在View,Area / {Area} / View等下面

我觉得这个解决scheme可以让你完全升级到MVC4,而不是有一个混合,而这对我来说不起作用。

  1. 在Visual Studio中,在某个单独的文件夹中创build一个新的“一次性”ASP.NET MVC 4应用程序。
  2. 用新的一次性应用程序中的新创build的视图web.config文件replace您的视图文件夹中的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

如果你遇到这个问题,你已经尝试了上述解决scheme,这不工作,请检查您的视图文件夹中的web.config。 可能有一些configuration与您的App根文件夹中的Web.config文件冲突

有些代码在当前的MVC位上运行,而另一些则被推送到了更新的位置。 不理解代码,我不能告诉你什么具体位是造成这个问题。

话虽如此,我决不会在生产开发机器上build立一个testing版。 现在很容易创build一个虚拟机,并在映像上运行testing版。 在Windows 7+中,如果你需要的话,你可以从金属上启动镜像,而不是使用perf命令(使用开发工具testing版,你不需要)。

为了完整性…

如果您不使用网页,也可以完全closures网页。

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

(我仍然不完全清楚剃刀视图和网页之间的关系,但似乎我的MVC应用程序与剃刀视图仍然适用于禁用网页。)

也作为最后一步清除错误来自项目的bin文件夹。