[asp.net] ASP.NET MVC 4 베타를 설치 한 후 InvalidCastException이 throw됩니다.

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’위치의 ‘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 ‘. Source = System.Web.WebPages.Razor

StackTrace :

System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) at System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String physicalPath) at System.Web.WebPages.Razor.RazorBuildProvider.GetHostFromConfig () at System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () at System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () at System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompilerType () at System.Web.Compilation.BuildProvider. System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders ()의 System.Web.Compilation.BuildProvidersCompiler.PerformBuild ()의 System.Web.Compilation.BuildManager에있는 GetCompilerTypeFromBuildProvider (BuildProvider buildProvider).System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)의 CompileWebFile (VirtualPath virtualPath) at System.Web.Compilation.PathWithPath.GetVPathBuildResult , Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) at System.Web. System.Web.Mvc.BuildManagerViewEngine의 Web.Mvc.IBuildManager.FileExists (String virtualPath).System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, List`1 위치, String name, String controllerName, String areaName, String cacheKey, String [] & searchedLocations)의 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) at 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) at System.Web.Mvc.ViewResultBase.ExecuteResult (ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult (ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker. <> System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)의 c__DisplayClass1c.b__19 () at 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) at System.Web. [project_namespace] .Controllers.GlobalizationController.ExecuteCore ()의 Mvc.Controller.ExecuteCore ()는 [file_path]의 System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext)는 System.Web.Mvc.ControllerBase.System.Web에 있습니다. Mvc.IController.Execute (RequestContext requestContext) at System.Web.Mvc.MvcHandler. <> 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 () at System.Web.Mvc.MvcHandler. <> c__DisplayClasse.b__d () at System.Web.Mvc.SecurityUtil.b__0 (Action f) at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Action action) at System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler. System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute ()의 System.Web.IHttpAsyncHandler.EndProcessRequest (IAsyncResult 결과) System.Web.HttpApplication.ExecuteStep (IExecutionStep 단계, Boolean & completedSynchronously)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) at System.Web. System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult)의 Mvc.SecurityUtil.ProcessInApplicationTrust (Action action) at 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 단계, Boolean & completedSynchronously)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) at System.Web. System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult)의 Mvc.SecurityUtil.ProcessInApplicationTrust (Action action) at 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 단계, Boolean & completedSynchronously)b__0 (Action f) at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Action action) at System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest ( IAsyncResult 결과) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () at System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completedSynchronously)b__0 (Action f) at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Action action) at System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest ( IAsyncResult 결과) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () at System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completedSynchronously)System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completedSynchronously)의 HttpApplication.IExecutionStep.Execute ()System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completedSynchronously)의 HttpApplication.IExecutionStep.Execute ()

이것은 나를 완전히 차단하고 베타를 유지하고 싶지만 예외를 제거하기 위해 완전히 제거해야 할 수도 있습니다.



답변

web.config에 다음을 추가해보십시오.

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

이 문제는 여러 빌드 공급자가 등록되고 최신 우승자가 있기 때문일 수 있습니다.


답변

같은 문제가 있었지만 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으로 변경 (새 항목을 삭제하고 추가)하도록 언급되지 않았습니다.


답변

한 가지 더, 오히려 늦게, 해결책 … 나는이 같은 문제에 부딪혔다. 여기에 나열된 모든 수정 사항을 수행했지만 (모두 감사합니다 !!!) 오류를 지나칠 수 없습니다. 마침내 절망적으로 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.


답변

MVC 2에서 MVC 3으로의 업그레이드에 대한 대만 블로그의 라인을 따라이 작업을 수행하는 또 다른 방법을 찾았습니다. http://blog.kkbruce.net/2011_04_01_archive.html (실제로 IE10에서 Microsoft 번역을 사용하여 영어 버전이고 꽤 좋은 번역입니다 …)

비결은 MVC3와 관련된 모든 버전 (예 : Razor, Mvc, Helper 어셈블리, 참조로 이동하여 참조 된 어셈블리의 모든 최신 버전을 확인하면 해당 버전이 무엇인지 알 수 있음)을 찾아서 변경하는 것입니다. 1.0.0.0-2.0.0.0 및 3.0.0.0-4.0.0.0 (공개 키가 동일하므로) 블로그에 따라 버전을 제거 할 수도 있습니다.

또 다른 중요한 점은 이러한 설정이 모든 Web.Config에 있다는 것입니다. 따라서 루트 아래뿐만 아니라 View, Area / {Area} / View 등에서도 마찬가지입니다.

이 솔루션을 사용하면 어쨌든 저에게 적합하지 않은 하이브리드를 사용하는 대신 MVC4로 완전히 업그레이드 할 수 있다고 생각합니다.


답변

  1. Visual Studio에서 어딘가에 별도의 폴더에 새로운 “폐기”ASP.NET MVC 4 응용 프로그램을 만듭니다.
  2. Views 폴더의 web.config 파일을 새 일회용 응용 프로그램에서 새로 만든 Views web.config 파일로 바꿉니다.

다음을 알 수 있습니다.

System.Web.WebPages.Razor변경 사항 Version=1.0.0.0에 대한 Version=2.0.0.0
System.Web.Mvc변경에서 Version=3.0.0.0Version=4.0.0.0


답변

이 문제가 발생하고 위의 해결책을 시도했지만 작동하지 않는 경우 pls는 Views 폴더에서 web.config를 확인합니다. 앱 루트 폴더의 Web.config 파일과 충돌하는 일부 구성이있을 수 있습니다.


답변

일부 코드는 현재 MVC 비트에서 실행되고 다른 일부는 최신 버전으로 푸시되었습니다. 코드를 이해하지 못하면 어떤 특정 비트가 문제를 일으키는 지 말할 수 없습니다.

그렇긴해도 프로덕션 개발 시스템에 베타를 설정하지 않을 것입니다. 요즘 VM을 만들고 이미지에서 베타를 실행하는 것은 너무 쉽습니다. Windows 7 이상에서는 필요한 경우 이미지를 금속에서 부팅하고 성능에 영향을주지 않을 수 있습니다 (개발 도구 베타에서는 자주 수행하지 않음).