sourcecode

ASP.NET MVC 4 베타를 설치한 후 InvalidCastException이 느려짐

copyscript 2023. 6. 18. 16:15
반응형

ASP.NET MVC 4 베타를 설치한 후 InvalidCastException이 느려짐

ASP.NET MVC 3이 설치된 시스템에 ASP.NET MVC 4 베타를 설치하면 다음과 같은 예외가 발생합니다.

System.InvalidCastException이 사용자 코드 Message=[A]System에서 처리되지 않았습니다.웹.웹 페이지.면도기. 구성.호스트 섹션을 [B]시스템에 캐스트할 수 없습니다.웹.웹 페이지.면도기. 구성.호스트 섹션.A형은 '시스템'에서 비롯됩니다.웹.웹 페이지.레이저, 버전=1.0.0.0, Culture=중립, 공개 키Token=31bf3856ad364e35' 위치의 'Default' 컨텍스트입니다.\Windows\Microsoft.네트\어셈블리\GAC_MSIL\System.웹.웹 페이지.Razor\v4.0_1.0.0_31bf3856ad364e35\System.웹.웹 페이지.면도칼.dll'.B형은 '시스템'에서 비롯됩니다.웹.웹 페이지.레이저, 버전=2.0.0.0, Culture=중립, 공개 키Token=31bf3856ad364e35' 위치의 'Default' 컨텍스트입니다.\Windows\Microsoft.네트\어셈블리\GAC_MSIL\System.웹.웹 페이지.Razor\v4.0_2.0.0_31bf3856ad364e35\System.웹.웹 페이지.면도칼.dll'.소스=시스템.웹.웹 페이지.면도칼

스택 추적:

시스템에서.웹.웹 페이지.레이저. 웹 레이저 호스트 팩토리.시스템에서 레이저 섹션(String virtualPath)을 가져옵니다.웹.웹 페이지.레이저. 웹 레이저 호스트 팩토리.시스템에서 CreateHostFromConfig(String virtualPath, String physicalPath).웹.웹 페이지.레이저.레이저 빌드 공급자.시스템에서 GetHostFromConfig().웹.웹 페이지.레이저.레이저 빌드 공급자.시스템에 호스트()를 생성합니다.웹.웹 페이지.레이저.레이저 빌드 공급자.시스템에서 생성된 코드()를 확인합니다.웹.웹 페이지.시스템에서 Razor.RazorBuildProvider.get_CodeCompilerType().웹, 편집.빌드 공급자.컴파일러 가져오기시스템에서 FromBuildProvider(BuildProvider buildProvider)를 입력합니다.웹, 편집.BuildProvidersCompiler.시스템에서 빌드 공급자()를 처리합니다.웹, 편집.BuildProvidersCompiler.시스템에서 빌드()를 수행합니다.웹, 편집.빌드 관리자.시스템에서 웹 파일(VirtualPath virtualPath)을 컴파일합니다.웹, 편집.빌드 관리자.VPathBuild 결과 가져오기시스템의 내부(VirtualPath virtualPath, boolean noBuild, boolean allowCrossApp, boolean allowBuildInPrecompile, boolean throwIfNotFound, boolean sureIsUpToDate)입니다.웹, 편집.빌드 관리자.GetVPathBuildResultWithNoAssert(HttpContextContext, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfFound, Boolean IsUpTate 확인)가 시스템에 있습니다.웹, 편집.빌드 관리자.시스템에서 GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContextcontext, 부울 allowCrossApp, 부울 throwIfFound).웹.MVC.빌드 관리자 래퍼.시스템. 웹.MVC.I 빌드 관리자.시스템에 파일이 있습니다(String virtualPath).웹.MVC.BuildManagerViewEngine.시스템에 파일(ControllerContextcontrollerContext, String virtualPath)이 있습니다.웹.MVC.VirtualPathProviderViewEngine입니다.GetPathFromGeneralName(ControllerContext, List'1 위치, 문자열 이름, 문자열 컨트롤러 이름, 문자열 영역 이름, 문자열 캐시Key, String[]& searchedLocations) 시스템.웹.MVC.VirtualPathProviderViewEngine입니다.시스템에서 GetPath(ControllerContextControllerContext, String[] 위치, String[] 영역 위치, StringLocationsPropertyName, StringControllerName, StringCacheKeyPrefix, 부울 useCache, String[] 및 검색된 위치).웹.MVC.VirtualPathProviderViewEngine입니다.시스템에서 FindView(ControllerContextcontrollerContext, StringviewName, StringmasterName, Boolean useCache)를 찾습니다.웹.MVC.엔진 컬렉션을 봅니다.<>c__DisplayClassc.b__b(IViewEngine)가 시스템에 있습니다.웹.MVC.엔진 컬렉션을 봅니다.시스템에서 찾기(Func`2 lookup, Boolean trackSearchedPaths).웹.MVC.엔진 컬렉션을 봅니다.시스템에서 FindView(ControllerContextcontrollerContext, StringviewName, StringmasterName)를 찾습니다.웹.MVC.결과를 봅니다.시스템에서 보기(컨트롤러 컨텍스트)를 찾습니다.웹.MVC.결과 기반 보기.시스템에서 결과 실행(컨트롤러 컨텍스트).웹.MVC.컨트롤러 작업호출자.시스템에서 ActionResult(ControllerContextcontrollerContext, ActionResult actionResult)를 호출합니다.웹.MVC.컨트롤러 작업호출자.<>c__DisplayClass1c.b__19()가 시스템에 있습니다.웹.MVC.컨트롤러 작업호출자.작업 결과 필터 호출(시스템에서 결과 필터 필터, 결과 실행 컨텍스트 사전 컨텍스트, Func'1 계속).웹.MVC.컨트롤러 작업호출자.<>c__DisplayClass1c.<>c__DisplayClass1e.b__1b()가 시스템에 있습니다.웹.MVC.컨트롤러 작업호출자.시스템에서 ActionResultWithFilters(ControllerContextContext, IList'1 필터, ActionResultactResult)를 호출합니다.웹.MVC.컨트롤러 작업호출자.시스템에서 작업(ControllerContextcontrollerContext, StringactName)을 호출합니다.웹.MVC.컨트롤러.[project_namespace]에서 코어()를 실행합니다.컨트롤러.세계화 컨트롤러.시스템의 [file_path]에서 코어()를 실행합니다.웹.MVC.컨트롤러 베이스.시스템에서 실행(RequestContextRequestContext)합니다.웹.MVC.컨트롤러 베이스.시스템. 웹.MVC.I 컨트롤러.시스템에서 실행(RequestContextRequestContext)합니다.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.b__5()가 시스템에 있습니다.웹.MVC.Async.AsyncResultWrapper입니다.<>c__DisplayClass1.b__0()이(가) 시스템에 있습니다.웹.MVC.Async.AsyncResultWrapper입니다.<>c__DisplayClass8'1.b__7(IAsyncResult_)이 시스템에 표시됩니다.웹.MVC.Async.AsyncResultWrapper입니다.RapedAsyncResult`1.시스템에서 끝().Web.Mvc.MvcHandler.<>c__표시 클래스.시스템에서 b__d().웹.MVC.보안 유틸리티.시스템에서 b_0(동작 f).웹.MVC.보안 유틸리티.프로세스 입력 응용 프로그램시스템에서 트러스트(액션 액션)를 선택합니다.Web.Mvc.MvcHandler.프로세스 요청 종료(시스템에 IAsyncResult asyncResult)가 있습니다.Web.Mvc.MvcHandler.시스템. 웹.IHTTpAsyncHandler.프로세스 요청 종료(시스템에서 IAsyncResult(IsyncResult)를 선택합니다.Web.Http 응용 프로그램.콜 핸들러실행 단계.시스템. 웹.HttpApplication.실행 단계.시스템에서 실행()합니다.Web.Http 응용 프로그램.ExecuteStep(I ExecutionStep 단계, Boolean & CompletedSynchronously)

이렇게 하면 완전히 차단되므로 베타를 유지하고 싶지만 예외를 제거하기 위해 베타를 완전히 제거해야 할 수도 있습니다.

을 ASP 4NET MVC 3으로 했습니다.이런 식으로 저는 이 주제를 시작했습니다.는 그, 의 근원은 은 문는제에대해찾만지았, 의근다니다다아, 니닙은그것릅은원.WebPages판본

저는 ASP.NET MVC 3 프로젝트를 ASP.NET MVC 4로 업그레이드하는 공식 가이드를 따라왔습니다.

문제를 해결하려면 웹에 추가해야 합니다.구성(아마도 이전에 추가된 구성):

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

또한 참고 사항에는 시스템 참조를 변경하기 위해 언급되지 않았습니다.1.0.0.0에서 2.0.0.0까지의 도우미(새 도우미 삭제 및 추가).

한가지 더, 다소 늦은 해결책이 있습니다...저도 같은 문제에 부딪혔습니다.여기에 나열된 모든 수정 사항(모두 감사합니다!!)을 수행했지만 오류를 극복하지 못했습니다.마침내 절망 속에서, 저는 Views 디렉토리에서 web.config 파일을 찾았습니다.이 파일에서 시스템 버전에 대한 여러 참조를 찾았습니다.웹.Mvc와 "4.0.0.0"으로 모두 충돌했습니다.더 중요한 것은, 저는 다음 줄을 발견하고 "시스템"의 버전 번호를 업데이트했습니다.web.webPages."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.

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

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

이 문제는 여러 빌드 제공자가 등록되고 최근에 성공했기 때문일 수 있습니다.

저는 MVC 2에서 MVC 3으로 업그레이드하는 대만인의 블로그 http://blog.kkbruce.net/2011_04_01_archive.html 에 줄을 서서 이것을 작동시키는 다른 방법을 찾았습니다. (실제로 IE10의 Microsoft Translate를 사용하여 영어 버전을 볼 수 있으며 꽤 좋은 번역입니다...)

이 방법은 MVC3와 관련된 모든 버전(예: Razor, Mvc, Helper 어셈블리)을 찾아 1.0.0에서 2.0.0으로, 3.0.0에서 4.0.0으로 변경하는 것입니다(공개 키가 동일하므로 참조로 가서 모든 최신 버전을 확인하면 해당 버전이 무엇인지 알 수 있습니다).블로그에 따라 버전을 제거할 수도 있습니다.

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

이 솔루션을 사용하면 하이브리드 대신 MVC4로 완전히 업그레이드할 수 있을 것 같습니다. 이 솔루션은 저에게 전혀 도움이 되지 않았습니다.

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

다음과 같은 사항을 알게 될 것입니다.

System.Web.WebPages.Razor에서 변경된 Version=1.0.0.0Version=2.0.0.0 System.Web.Mvc에서 변경된 Version=3.0.0.0Version=4.0.0.0

이 문제가 발생하여 위의 솔루션을 시도했지만 작동하지 않으면 Views 폴더에서 web.config를 확인하십시오.앱 루트 폴더의 Web.config 파일과 충돌하는 일부 구성이 있을 수 있습니다.

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

그렇다고는 하지만, 저는 생산 개발 기계에 베타를 설치하지는 않을 것입니다.요즘에는 VM을 생성하고 이미지에서 베타를 실행하는 것이 너무 쉽습니다.Windows 7+에서는 필요한 경우 금속에서 이미지를 부팅할 수 있지만 성능 저하는 제거할 수 없습니다(개발 도구 베타를 사용하는 경우가 많습니다)

완전성을 위해서라면...

웹 페이지를 사용하지 않는 경우 웹 페이지를 모두 끌 수도 있습니다.

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

(레이저 보기와 웹 페이지 간의 관계에 대해서는 아직 완전히 알지 못하지만, 레이저 보기가 있는 MVC 앱은 웹 페이지를 비활성화한 상태에서 여전히 작동하는 것 같습니다.)

또한 마지막 단계로 오류가 발생한 프로젝트에서 bin 폴더를 지웁니다.

언급URL : https://stackoverflow.com/questions/9403477/invalidcastexception-is-thrown-after-installing-asp-net-mvc-4-beta

반응형