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

Nik*_*nis 82 asp.net asp.net-mvc razor asp.net-webpages asp.net-mvc-4

在使用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源自'System.Web.WebPages.Razor,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35',位于'默认'位置'C:\ Windows\Microsoft.Net\assembly\GAC_MSIL\System .Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll".\的Windows\Microsoft.Net \组件\ GAC_MSIL \系统:B型从 'System.Web.WebPages.Razor,版本= 2.0.0.0,文化=中性公钥= 31bf3856ad364e35' 在位置上下文 '默认'"C起源.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll".来源= System.Web.WebPages.Razor

堆栈跟踪:

位于System.Web.WebPages.Razor.Razor.RazorBuildProvider.GetHostFromConfig()的System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig(String virtualPath,String physicalPath)上的System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection(String virtualPath)处系统.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.Build上的System.Web.Compilation.Build上的System.Web.Compilation.Build上的System.Web.Compilation.BuildProvidersCompiler.PerformBuild()的System.Web.Compilation.Build上的GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)位于System.Web.Compilation上的System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath虚拟路径). BuildManager.GetVPathBuildResultInternal(virtualPath virtualPath,布尔noBuild,布尔allowCrossApp,布尔allowBuildInPrecompile,布尔throwIfNotFound,布尔ensureIsUpToDate)一 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext context,Boolean)中的System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context,VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate) System.Web.Mvc上System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext,String virtualPath)上的System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(String virtualPath)中的allowCrossApp,Boolean throwIfNotFound System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext,String []位置,.VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext,List`1位置,String name,String controllerName,String areaName,String cacheKey,String []&searchingLocations), String [] areaLocations,String locationsPropertyName,S 在System.Web.Mvc.ViewEngineCollection上的System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext,String viewName,String masterName,Boolean useCache)中输入name,String controllerName,String cacheKeyPrefix,Boolean useCache,String []&searchingLocations).位于System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext,String viewName,String masterName)的System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup,Boolean 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 context)中的.Web.Mvc.ViewResult.FindView(ControllerContext context). ControllerActionInvoker.<> c__DisplayClass1c.b__19()在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter滤波器,ResultExecutingContext preContext,趣味 系统中System.Web.Mvc.ControllerActionInvoker.<> c__DisplayClass1c.<> c__DisplayClass1e.b__1b()的System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList`1过滤器,ActionResult actionResult)中的c`1 continuation). System.Web.Mvc.ControllerBase的[file_path]中的[project_namespace] .Controllers.GlobalizationController.ExecuteCore()处的System.Web.Mvc.Controller.ExecuteCore()的Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName) System.Web.Mvc.MvcHandler上的System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)中的.Execute(RequestContext requestContext).<> c__DisplayClass6.<> c__DisplayClassb.b__5()at System System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult上的System.Web.Mvc.Async.AsyncResultWrapper.<> c__DisplayClass8`1.b__7(IAsyncResult _)中的.Web.Mvc.Async.AsyncResultWrapper.<> c__DisplayClass1.b__0() System.Web.Mvc.MvcHandler上的`1.End()System.Web.Mvc.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)上的System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)中的System.Web.Mvc.SecurityUtil.b__0(Action f)上的.<> c__DisplayClasse.b__d() System.Web.HttpApplication.ExecuteStep(IExecutionStep)上System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()的System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果) step,Boolean&completedSynchronously)

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

Rol*_*ice 102

我有同样的问题,但是在将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>
Run Code Online (Sandbox Code Playgroud)

另外在注释中没有提到将System.Web.Helpers的引用从1.0.0.0更改为2.0.0.0(删除并添加新的).

  • +1感谢加载分享.我做的一个微小变化是使用`oldVersion ="1.0.0.0-2.0.0.0"`只是为了遵循MVC4项目模板中使用的约定.有趣的是,MVC4项目模板中的根**Web.config**也不存在`System.Web.WebPages.Razor`的`dependentAssembly`. (2认同)

Ste*_*e G 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>
Run Code Online (Sandbox Code Playgroud)

史蒂夫G.


mar*_*ind 32

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

<appSettings>
  <add key="webpages:Version" value="1.0.0.0"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

问题可能是由于多个构建提供程序已注册且最新获胜.


lao*_*ent 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而不是混合动力,但这对我来说无效.