安装ASP.NET MVC 4 Beta后抛出InvalidCastException

时间:2012-02-22 21:38:41

标签: asp.net asp.net-mvc razor asp.net-mvc-4 asp.net-webpages

在使用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)

这完全阻止了我,虽然我想保留测试版,但我可能需要完全删除它才能摆脱异常。

9 个答案:

答案 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)

  1. 在Visual Studio中,在某个单独的文件夹中创建一个新的“一次性”ASP.NET MVC 4应用程序。
  2. 使用新一次性应用程序中新创建的Views web.config文件替换Views文件夹中的web.config文件。
  3. 你会注意到:

    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

答案 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文件夹。