asp.net - mvc4




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

在使用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来自位于'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”。 类型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.GetRazorSection(String virtualPath)System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(String virtualPath,String physicalPath)at 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(VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate)a 在System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext context,Boolean)时,System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext上下文,VirtualPath virtualPath,布尔noBuild,布尔allowCrossApp,布尔allowBuildInPrecompile,布尔throwIfNotFound,布尔ensureIsUpToDate)在System.Web.Mvc上System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext,字符串virtualPath)上System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(String virtualPath)上的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.ViewEngineCollection)处的System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext,String viewName,String masterName,Boolean useCache)中的名称,字符串controllerName,字符串cacheKeyPrefix,布尔useCache,字符串[]和SearchingLocations) System.Web.Mvc.ViewEngineCollection.FindView(System.Web.Mvc.ViewEngineCollection.Find(ControllerContext controllerContext,String viewName,String masterName)上System.Web.Mvc.ViewEngineCollection.Find(Func`2查找,布尔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。<> c__DisplayClass1c。<> c__DisplayClass1e.b__1b()at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1 filters,ActionResult actionResult)at System。 Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)System.Web.Mvc.Controller.ExecuteCore()at [project_namespace] .Controllers.GlobalizationController.ExecuteCore()in [file_path] at 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 .Web.Mvc.Async.AsyncResultWrapper。<> c__DisplayClass1.b__0()at System.Web.Mvc.Async.AsyncResultWrapper。<> c__DisplayClass8`1.b__7(IAsyncResult _)at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult `1.End()在System.Web.Mvc.MvcHandler System.Web.Mvc.SecurityUtil.b__0上的System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)上的System.Web.Mvc.SecurityUtil.b__0(Action f)上的c__DisplayClasse.b__d()(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步骤,布尔&完成同步)

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


  1. 在Visual Studio中,在一个单独的文件夹中创建一个新的“一次性”ASP.NET MVC 4应用程序。
  2. 将您的Views文件夹中的web.config文件替换为新的一次性应用程序中新创建的Views 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


为了完整起见......

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

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

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


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

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

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


您的一些代码正在运行在当前的MVC位上,而其他一些代码则被推送到了更新的位置。 如果不理解代码,我不能告诉你具体位是什么导致问题。

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


我有同样的问题,但是当将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的Reference从1.0.0.0更改为2.0.0.0(删除并添加新的)。


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







asp.net-webpages