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


81

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

用户代码Message = [A] System.Web.WebPages.Razor.Configuration.HostSection无法处理System.InvalidCastException,无法将其强制转换为[B] System.Web.WebPages.Razor.Configuration.HostSection。类型A源自'System.Web.WebPages.Razor,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'在上下文'Default'中的位置'C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll'。类型B源自位置'C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System的上下文'Default'中的'System.Web.WebPages.Razor,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35' .Web.WebPages.Razor \ v4.0_2.0.0。0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll'。源= System.Web.WebPages.Razor

堆栈跟踪:

在System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(String virtualPath,String physicalPath)在System.Web.WebPages.Razor.RazorBuildProvider.GetHostFromConfig()在System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection(String virtualPath) System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode()处于System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType()处于System.Web.Compilation.BuildProvider处的System.Web.WebPages.Razor.RazorBuildProvider.CreateHost()。 System.Web.Compilation.BuildProviders的System.Web.Compilation.BuildProvidersCompiler.PerformBuild()的System.Web.Compilation.BuildProviders的GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)。System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(VirtualPath virtualPath,布尔值noBuild,布尔值allowCrossApp,布尔值allowBuildInPrecompile,布尔throwIfNotFound,布尔数确保IsUpToDate) ,System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext上下文,布尔型allowCrossApp,布尔型IfIfNotFound)在System.Web.Mvc.BuildManagerWrapper。 System.Web.Mvc.BuildManagerViewEngine上的Web.Mvc.IBuildManager.FileExists(String virtualPath)。System.Web上System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext,List`1的位置,字符串名称,字符串controllerName,字符串areaName,字符串cacheKey,字符串[]&searchedLocations)的FileExists(ControllerContext controllerContext,String virtualPath)。 Mvc.VirtualPathProviderViewEngine.GetPath(System.Web.Mvc.VirtualPathProviderViewEngine.FindView上的ControllerContext controllerContext,String [] location,String [] areaLocations,String locationPropertyName,String name,String controllerName,String cacheKeyPrefix,布尔useCache,String []&searchedLocations)。 (ControllerContext controllerContext,String viewName,String masterName,Boolean useCache)位于System.Web.Mvc.ViewEngineCollection。<> c__DisplayClassc。System.Web.Mvc.ViewEngineCollection.Find上的b__b(IViewEngine e)(System.Web.Mvc.ViewEngineCollection.FindView(Func`2 lookup,Boolean trackSearchedPaths)在System.Web.Mvc上的System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext,String viewName,String masterName) System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext上下文)在System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult)在System.Web.Mvc.ControllerActionInvoker。<> System.Web.Mvc.ControllerActionInvoker上的c__DisplayClass1c.b__19()在System.Web.Mvc.ControllerActionInvoker.I>上的c__DisplayClass1c.b__19()在System.Web.Mvc.ControllerActionInvoker。<> c__DisplayClass1c。<System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,ActionResult actionResult)在System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)在System.Web处> c__DisplayClass1e.b__1b()。在System.Web.Mvc.ControllerBase.System.Web的System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)在[文件路径]的[project_namespace]中的Mvc.Controller.ExecuteCore()。 System.Web.Mvc.MvcHandler上的Mvc.IController.Execute(RequestContext requestContext).System的System.Web.Mvc.Async.AsyncResultWrapper上的<> c__DisplayClass6。<> c__DisplayClassb.b__5()。System上的c >> ____ DisplayClass1.b__0()。 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(Action f)在System.Web.Mvc.MvcHandler.System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)处System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)。位于System.Web.HttpApplication.ExecuteStep处的System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)(位于System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔且已完成)处的System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()System.Web.Mvc.MvcHandler上的Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()。System.Web上System.Web.Mvc.SecurityUtil.b__0(动作f)处的<> c__DisplayClasse.b__d()。 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)处的System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)处的Mvc.SecurityUtil.ProcessInApplicationTrust(Action操作) System.Web.HttpApplication.ExecuteStep处的CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()(IExecutionStep步骤,布尔值和完成同步)System.Web.Mvc.MvcHandler的Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()。System.Web的System.Web.Mvc.SecurityUtil.b__0(动作f)处的<> c__DisplayClasse.b__d()。 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)处的System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)处的Mvc.SecurityUtil.ProcessInApplicationTrust(Action操作) System.Web.HttpApplication.ExecuteStep处的CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()(IExecutionStep步骤,布尔值和完成同步)System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)的System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action动作)的b__0(Action f)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.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)的System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action动作)的b__0(Action f)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步骤,布尔值和完成同步)System.Web.HttpApplication.ExecuteStep上的HttpApplication.IExecutionStep.Execute()(IExecutionStep步骤,布尔值和完成同步)

这完全阻止了我,并且尽管我想保留beta,但为了摆脱异常,可能需要将其完全删除。


1
您是否正在运行.net 4.5 Dev预览?(那个版本与当前的Beta版本不兼容)(仅出于记录,不是我拒绝投票,这个问题是合理的)
Michael Stum

1
不,我根本不运行4.5。
Nikos

3
说真的,为什么这票数低?我对他人可能会遇到的事情提供反馈。
Nikos Baxevanis,2012年

@MichaelStum好,不用担心。:)
Nikos Baxevanis 2012年

对困惑感到抱歉。我试图“收藏”此问题,然后误按了= P Downvote,将其删除,此收藏夹已正确添加。
乔什·达内尔

Answers:


31

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

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

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


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中也缺少dependentAssemblyfor 。System.Web.WebPages.Razor
Scotty.NET 2013年

1
我在将MVC 4 NuGet软件包更新到5.1.1时遇到了类似的问题,上述问题已解决,但是oldVersion="2.0.0.0" newVersion="3.0.0.0"
Luke Puplett 2014年

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

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中。因此,不仅在您的根目录下,而且在视图,区域/ {Area} /视图等下。

我觉得这种解决方案可以让您完全升级到MVC4,而不必使用混合动力,这对我来说还是行不通的。


4
  1. 在Visual Studio中,在某个地方的单独文件夹中创建一个新的“废弃” ASP.NET MVC 4应用程序。
  2. 用新的一次性应用程序中新创建的Views web.config文件替换Views文件夹中的web.config文件。

您会注意到:

System.Web.WebPages.Razor改变来自Version=1.0.0.0Version=2.0.0.0 System.Web.Mvc变化从Version=3.0.0.0Version=4.0.0.0


3

如果您遇到此问题,并且已经尝试了上述解决方案,但无法正常工作,请检查Views文件夹中的web.config。应用程序根文件夹中的某些配置可能与Web.config文件冲突


0

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

话虽如此,我永远不会在生产开发机器上设置beta。这几天创建VM并在映像上运行Beta太容易了。在Windows 7+中,如果需要的话,您可以从金属启动映像,而不会造成性能损失(使用dev tool betas经常这样做)。


是的,但是此Beta具有上线许可证。毕竟,它仍然在VM上,但是VM也具有ASP.NET MVC 3。
尼科斯Baxevanis

您需要确定3中的哪个位正在4中运行,因为那是您遇到冲突的地方。Web表单移入.NET 2时间框架时,发生了很多相同的事情,并且对于任何附加组件(例如MVC?)来说都是一个问题。
格雷戈里·比默

实际上,这是一个很大的ASP.NET MVC 3项目。4中什么也没有运行。我无法启动3个项目。在appSettings元素中添加<add key =“ webpages:Version” value =“ 1.0.0.0” />可以解决此问题。
Nikos Baxevanis,2012年

0

为了完整性...

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

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

(对于剃刀视图和网页之间的关系,我仍然不十分清楚,但是似乎我的带有剃刀视图的MVC应用仍然可以在禁用网页的情况下使用。)


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.