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


81

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 ()

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


1
혹시 .net 4.5 Dev Preview를 실행하고 있습니까? (그것은 현재 베타 버전과 호환되지 않습니다.) (기록을 위해서, 제가 반대표를 던진 사람이 아니 었습니다. 질문은 합법적입니다)
— Michael Stum

1
아니요, 저는 4.5를 전혀 실행하지 않습니다.
— Nikos Baxevanis 2012

3
진지하게, 왜 이것이 반대 투표입니까? 다른 사람에게 일어날 수있는 일에 대해 피드백을 제공합니다.
— Nikos Baxevanis 2012

@MichaelStum OK, 걱정 마세요. :)
— Nikos Baxevanis 2012

혼란을 드려 죄송합니다. 이 질문을 "즐겨 찾기"하려고했는데 = P Downvote를 잘못 클릭했습니다. 이번에는 즐겨 찾기가 올바르게 추가되었습니다.
— Josh Darnell

답변:


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 프로젝트 템플릿에서 사용되는 규칙을 따르기 위해 사용하는 것입니다. 흥미롭게도 dependentAssemblyfor System.Web.WebPages.Razor는 MVC4 프로젝트 템플릿 의 루트 Web.config 에도 없습니다 .
— Scotty.NET 2013-08-27

1
나는 위의 만에 해결 5.1.1 MVC 4 NuGet 패키지를 업데이트 비슷한 문제가 있었다oldVersion="2.0.0.0" newVersion="3.0.0.0"
— 누가 복음 Puplett

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 2013

5

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로 완전히 업그레이드 할 수 있다고 생각합니다.


4
  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.0에Version=4.0.0.0


3

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


0

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

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


예,하지만이 베타에는 라이브 라이선스가 있습니다. 어쨌든 VM에 있지만 VM에는 ASP.NET MVC 3도 있습니다.
— Nikos Baxevanis 2012

충돌이있는 위치이므로 3의 어느 비트가 4에서 실행 중인지 확인해야합니다. .NET 2 시간대로 이동하면서 Web Forms에서도 동일한 일이 발생했으며 MVC와 같은 추가 기능에서 상당한 문제가되었습니다.
— Gregory A Beamer 2012

실제로 매우 큰 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 폴더를 지우십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.