82

在装有 ASP.NET MVC 3 的机器上安装 ASP.NET MVC 4 Beta 后出现以下异常。

System.InvalidCastException 未被用户代码处理 Message=[A]System.Web.WebPages.Razor.Configuration.HostSection 无法转换为 [B]System.Web.WebPages.Razor.Configuration.HostSection。类型 A 源自位置 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System .Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'。类型 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

堆栈跟踪:

在 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.get_CodeCompilerType() 中 System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType() 中 System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode() 中的 System.Web.WebPages.Razor.RazorBuildProvider.CreateHost()。 GetCompilerTypeFromBuildProvider(BuildProvider buildProvider) 在 System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() 在 System.Web.Compilation.BuildProvidersCompiler.PerformBuild() 在 System.Web.Compilation.BuildManager。System.Web.Compilation.BuildManager.GetVPathBuildResultInternal 处的 CompileWebFile(VirtualPath virtualPath)(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath ,布尔 noBuild,布尔allowCrossApp,布尔allowBuildInPrecompile,布尔throwIfNotFound,布尔ensureIsUpToDate)在System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext上下文,布尔allowCrossApp,布尔throwIfNotFound)在System.Web.Mvc.BuildManagerWrapper.System。 System.Web.Mvc.BuildManagerViewEngine 中的 Web.Mvc.IBuildManager.FileExists(String virtualPath)。System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext, List`1 locations, String name, String controllerName, String areaName, String cacheKey, String[]& searchedLocations) 在 System.Web 的 FileExists(ControllerContext controllerContext, String virtualPath)。 System.Web.Mvc.VirtualPathProviderViewEngine.FindView 处的 Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations) (ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) 在 System.Web.Mvc.ViewEngineCollection.<>c__DisplayClassc。b__b(IViewEngine e) at System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths) at System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext, String viewName, String masterName) at 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 filter, ResultExecutingContext preContext, Func`1 continuation) 在 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<>c__DisplayClass1e.b__1b() 在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 过滤器, ActionResult actionResult)。 Mvc.Controller.ExecuteCore() 在 [project_namespace].Controllers.GlobalizationController.ExecuteCore() 在 [file_path] 在 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() 在系统。 Web.Mvc。Async.AsyncResultWrapper.<>c__DisplayClass8`1.b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.b__d() at System.Web.Mvc.SecurityUtil.b__0(Action f) 在 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) 在 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 在 System.Web.Mvc.MvcHandler。 System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 在 System.Web.Mvc.MvcHandler.<>c__DisplayClasse.b__d() 在 System.Web.Mvc.SecurityUtil.b__0(Action f) 在 System.Web。 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 的 System.Web.Mvc.MvcHandler.System.Web.HttpApplication 的 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 的 Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)。 CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 在 System.Web.Mvc.MvcHandler.<>c__DisplayClasse.b__d() 在 System.Web.Mvc.SecurityUtil.b__0(Action f) 在 System.Web。 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 的 System.Web.Mvc.MvcHandler.System.Web.HttpApplication 的 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 的 Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)。 CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)b__0(操作 f)在 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(操作操作)在 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 步骤,布尔和完成同步)b__0(操作 f)在 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(操作操作)在 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 步骤,布尔和完成同步)System.Web.HttpApplication.ExecuteStep 处的 HttpApplication.IExecutionStep.Execute()(IExecutionStep 步骤,Boolean& completedSynchronously)System.Web.HttpApplication.ExecuteStep 处的 HttpApplication.IExecutionStep.Execute()(IExecutionStep 步骤,Boolean& completedSynchronously)

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

4

9 回答 9

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(删除并添加新的)。

于 2012-05-11T18:37:04.923 回答
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。

于 2013-01-10T23:16:27.500 回答
32

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

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

该问题可能是由于注册了多个构建提供程序并且最新的获胜。

于 2012-02-22T22:18:35.153 回答
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,而不是使用混合,这对我来说无论如何都不起作用。

于 2012-03-05T18:44:29.500 回答
4
  1. 在 Visual Studio 中,在某个单独的文件夹中创建一个新的“一次性”ASP.NET MVC 4 应用程序。
  2. 将 Views 文件夹中的 web.config 文件替换为新一次性应用程序中新创建的 Views web.config 文件。

你会注意到:

System.Web.WebPages.RazorVersion=1.0.0.0Version=2.0.0.0 System.Web.Mvc变化 从Version=3.0.0.0Version=4.0.0.0

于 2013-05-24T15:19:08.390 回答
3

如果您遇到此问题并且您已尝试上述解决方案但仍无效,请检查您的 Views 文件夹中的 web.config。可能有一些配置与您的 App 根文件夹中的 Web.config 文件冲突

于 2013-01-21T14:59:35.637 回答
0

同样作为最后一步,从错误所在的项目中清除您的 bin 文件夹。

于 2013-05-31T13:38:00.020 回答
0

为了完整起见...

如果您不使用网页,您也可以完全关闭它们。

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

(我仍然不完全清楚剃刀视图和网页之间的关系,但似乎我的带有剃刀视图的 MVC 应用程序仍然可以在禁用网页的情况下工作。)

于 2012-06-28T16:08:35.860 回答
0

您的一些代码在当前 MVC 位上运行,而其他代码已被推送到较新的位。在不了解代码的情况下,我无法告诉您导致问题的具体位。

话虽如此,我永远不会在生产开发机器上设置测试版。如今,创建 VM 并在映像上运行 beta 太容易了。在 Windows 7+ 中,如果需要,您可以从金属上启动映像,而不是受到性能影响(使用开发工具测试版,您经常这样做)。

于 2012-02-22T22:16:39.953 回答