在使用ASP.NET MVC 3的计算机上安装ASP.NET MVC 4 Beta后,出现以下异常。
System.InvalidCastException未被用户代码处理 消息= [A] System.Web.WebPages.Razor.Configuration.HostSection无法强制转换 到[B] System.Web.WebPages.Razor.Configuration.HostSection。 A型起源 来自' System.Web.WebPages.Razor,Version = 1.0.0.0,Culture = neutral, 公钥= 31bf3856ad364e35'在上下文中'默认'在位置 ' C:\的Windows \ Microsoft.Net \组件\ GAC_MSIL \ System.Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll&#39 ;. 类型B源自' 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
堆栈跟踪:
at System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection(String virtualPath) 在System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(String virtualPath,String physicalPath) 在System.Web.WebPages.Razor.RazorBuildProvider.GetHostFromConfig() 在System.Web.WebPages.Razor.RazorBuildProvider.CreateHost() 在System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode() 在System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType() 在System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider) 在System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() 在System.Web.Compilation.BuildProvidersCompiler.PerformBuild() 在System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) 在System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate) at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context,VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate) 在System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext context,Boolean allowCrossApp,Boolean throwIfNotFound) 在System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(String virtualPath) 在System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext,String virtualPath) 在System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext,List`1位置,String name,String controllerName,String areaName,String cacheKey,String []&searchLocations) 在System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext,String [] locations,String [] areaLocations,String locationsPropertyName,String name,String controllerName,String cacheKeyPrefix,Boolean useCache,String []&searchLocations) 在System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext,String viewName,String masterName,Boolean useCache) 在System.Web.Mvc.ViewEngineCollection。<> c__DisplayClassc.b__b(IViewEngine e) 在System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup,Boolean trackSearchedPaths) 在System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext,String viewName,String masterName) 在System.Web.Mvc.ViewResult.FindView(ControllerContext context) 在System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) 在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult) 在System.Web.Mvc.ControllerActionInvoker。<> c__DisplayClass1c.b__19() 在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func`1 continuation) 在System.Web.Mvc.ControllerActionInvoker。<> c__DisplayClass1c。<> c__DisplayClass1e.b__1b() 在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,ActionResult actionResult) 在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName) 在System.Web.Mvc.Controller.ExecuteCore() at [file_namespace]。[control_path]中的.Controllers.GlobalizationController.ExecuteCore() 在System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) 在System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) 在System.Web.Mvc.MvcHandler。<> c__DisplayClass6。<> c__DisplayClassb.b__5() 在System.Web.Mvc.Async.AsyncResultWrapper。<> c__DisplayClass1.b__0() 在System.Web.Mvc.Async.AsyncResultWrapper。<> c__DisplayClass8`1.b__7(IAsyncResult _) 在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 在System.Web.Mvc.MvcHandler。<> c__DisplayClasse.b__d() 在System.Web.Mvc.SecurityUtil.b__0(行动f) 在System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 在System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 在System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果) 在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)
这完全阻止了我,虽然我想保留测试版,但我可能需要完全删除它才能摆脱异常。
答案 0 :(得分:101)
我遇到了同样的问题,但是在将ASP.NET MVC 3迁移到ASP.NET MVC 4时。这样我开始讨论这个主题。
我找到了问题的解决方案,但其来源不同,它不是来自WebPages
版本。
我遵循了官方指南(可以这么说)Upgrading an ASP.NET MVC 3 Project to 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(删除并添加新的)。
答案 1 :(得分: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。
答案 2 :(得分:32)
尝试在web.config中添加以下内容:
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
</appSettings>
问题可能是由于多个构建提供程序已注册且最新获胜。
答案 3 :(得分:5)
我找到了另一种方法让这个工作,沿着台湾的博客从MVC 2升级到MVC 3:http://blog.kkbruce.net/2011_04_01_archive.html(你实际上可以在IE10中使用Microsoft Translate查看英文版本和它是一个相当不错的翻译...)
诀窍是找到与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等
下我觉得这个解决方案可以让你完全升级到MVC4而不是混合动力,但这对我来说无效。
答案 4 :(得分:4)
你会注意到:
System.Web.WebPages.Razor
从Version=1.0.0.0
更改为Version=2.0.0.0
System.Web.Mvc
从Version=3.0.0.0
更改为Version=4.0.0.0
答案 5 :(得分:3)
如果您遇到此问题并且您已尝试过上述解决方案但这不起作用,请检查Views文件夹中的web.config。可能有一些配置与App根文件夹中的Web.config文件冲突
答案 6 :(得分:0)
您的一些代码在当前的MVC位上运行,而其他代码则已推送到更新的代码。在不理解代码的情况下,我无法告诉您具体位导致了什么问题。
话虽如此,我绝不会在生产开发机器上设置测试版。这些天创建虚拟机并在映像上运行测试版太容易了。在Windows 7+中,如果需要,你可以从金属引导图像而不是引人注目(使用开发工具测试版,你可以这样做)。
答案 7 :(得分:0)
为了完整起见......
如果您不使用网页,也可以完全关闭网页。
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
(我还不完全清楚剃刀视图和网页之间的关系,但似乎我的MVC应用程序带有剃刀视图仍可用于禁用网页。)
答案 8 :(得分:0)
同样,最后一步从发生错误的项目中清除bin文件夹。