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