IT

파일 또는 어셈블리 '시스템'을 로드할 수 없습니다.MVC4 웹 API의 Net.Http 버전= 2.0.0

itgroup 2023. 7. 12. 23:41
반응형

파일 또는 어셈블리 '시스템'을 로드할 수 없습니다.MVC4 웹 API의 Net.Http 버전= 2.0.0

저는 좀 이상한 문제가 있습니다.
저는 MVC 4와 새로운 웹 API를 가진 앱을 개발했고 그것은 현지에서 잘 작동합니다.서버에 MVC4를 설치하고 앱을 배포했습니다.이제 다음 오류가 발생합니다.

파일 또는 어셈블리 '시스템'을 로드할 수 없습니다.Net.Http, 버전=2.0.0.0, Culture=중립, 공개 키Token=31bf3856ad364e35' 또는 그 종속성 중 하나입니다.위치한 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT에서 제외: 0x80131040)

설명:현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다.오류와 오류 발생 위치에 대한 자세한 내용은 스택 추적을 검토하십시오.

재미있는 것은 시스템 버전입니다.패키지 폴더 또는 ASP.NET MVC 4\Assemblies 폴더에 로컬로 있는 Net.Http는 1.0.0입니다.실제로 System에 대한 참조를 삭제했습니다.제 프로젝트의 Net.http입니다만, 여전히 같은 메시지가 표시됩니다.2.0.0.0 참조를 어디서 얻는지, 서버에서 로컬로 작동하지 않는 이유가 무엇인지 약간 혼란스럽습니다.

너트 종속성 확인:

ASP.NET WEB API 핵심 라이브러리(베타)는 시스템에 따라 다릅니다.http.http.포맷.
그리고 시스템.http.http.포맷은 시스템에 따라 다릅니다.http.http.
저는 이것이 바로 여기서 나온 것이라고 생각합니다. 이 2 1설치되어 있다는 것뿐입니다. 단지 내부의 dll에 버전 1.0.0이 있습니다.

내가 뭘 빼놓았나요?

업데이트:

이것은 다른 ASP.NET 앱의 하위 응용 프로그램이지만 다른 응용 프로그램은 여전히 웹 양식을 기반으로 합니다.그래서 뭔가가 엉망이 되고 있습니다.그러나 web.config의 어셈블리 섹션에서 청소를 하면 앱 자체를 더 이상 찾을 수 없습니다.

IIS 6.0에 이전에 변환된(.NET 4.5에서 4.0으로) 웹 앱을 배포하는 동안 동일한 오류가 발생했습니다.

web.config 런타임 섹션에서 찾았습니다.

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>

내가 바꾼 것.

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>

이제는 매력적으로 작동합니다.

앱 항구에 앱을 배포할 때도 같은 문제가 있었습니다..NET 4.5를 아직 지원하지 않는 문제입니다.내가 한 일.

  1. 프로젝트를 .NET 4.0 프로필로 전환했습니다.
  2. Web API NuGet 패키지를 제거했습니다.
  3. Web API(Beta) NuGet 패키지를 다시 설치했습니다.
  4. .csproj 파일에 참조된 모든 어셈블리에 대한 내용이 포함되어 있으므로 항상 GAC가 아닌 Bin 폴더에서 파일을 가져옵니다.

내 작업 내용:

1-4를 2.0으로 리디렉션합니다.

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a"   culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>

프로젝트의 참조 폴더에 이 dll에 대한 참조가 있어야 하며 버전은 2.0.0.0이어야 합니다.로컬 복사 = true로 설정되어 있는지 확인합니다.그런 다음 서버 앱의 bin 폴더로 이동합니다.

이것은 nuget에 의해 관리되는 라이브러리 중 하나입니다.Nuget을 열고 모든 것이 최신 상태인지 확인합니다..\packages\System.Net.Http.2.0.20126.16343\lib\net40

새로운 MVC4 앱을 만들고 해당 파일이 표시되는지 확인할 수도 있습니다.

제 경우 훨씬 더 쉬운 방법으로 수정했습니다. nuget 패키지에 대한 참조에 HintPath를 지정하십시오.

     <Reference Include="System.Data.Entity" />
     <Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
       <Private>True</Private>
+      <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll</HintPath>
     </Reference>
     <Reference Include="System.Net.Http.WebRequest, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
       <Private>True</Private>
+      <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.WebRequest.dll</HintPath>
     </Reference>
     <Reference Include="System.Numerics" />
     <Reference Include="System.Security" />

저의 경우 의도치 않게 시스템에 종속성을 추가했습니다.Net.Http 버전 2.1.10.0 ~ NuGet.NuGet Package Manager에서 제거할 수 없었습니다(다른 패키지가 패키지에 종속되어 있는 것 같았기 때문입니다.그러나 이러한 패키지는 이 특정 버전에 종속되지 않습니다.이것을 제거하기 위해 제가 한 일은 다음과 같습니다. (–force 매개 변수를 사용하여) 대신 NuGet 콘솔을 사용할 수도 있습니다.

  • Microsoft 버전을 변경합니다.Net.Http in packages.config in 2.1.10.0 ~ 2.0.0
  • NuGet Package Manager에서 BCL Portability Pack 제거
  • 종속 라이브러리(시스템)를 수동으로 제거합니다.넷. http.버전 2.1.10.0을 사용하는 경우
  • 시스템에 참조를 추가합니다.Net.Http 2.0.0.0

파일 구성에서 종속 어셈블리를 삭제했습니다.

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.0.0.0"/>
<dependentAssembly>

이제는 잘 작동합니다.

테스트 서버(Windows 2008 R2)에서 이 문제가 발생했습니다. 테스트 서버(Windows 2008 R2)는 배포할 준비가 되어 있었습니다.

시스템 버전을 확인했을 때 힌트가 있었습니다.내 DEV 컴퓨터와 배포 서버 사이의 넷이 일치하지 않습니다.

아래 단계를 사용하여 수정:

  1. 여기에서 .NET Framework 4.5 독립 실행형 설치 관리자를 다운로드했습니다.

  2. 배포 시스템에서 설치 관리자 실행

프레임워크 설치 후 서버가 재부팅을 원했고, 이는 vola!우리는 준비됐습니다.

VS 2013을 사용하고 있으며, 새로운 MVC 4 웹 API를 생성했으며 TeamCity 서버에 빌드할 때 system.net .dll.dll이 올바른 버전이 아닌 문제가 있었지만 VS 2013이 설치된 로컬 개발자 시스템에서는 잘 빌드됩니다.

우리는 마침내 그 문제를 알아냈습니다.

새로운 MVC 4 웹 API를 생성하고 프로젝트 생성에 대한 프레임워크 4.0을 선택했을 때 DLL에 대한 올바른 NuGet 패키지 버전이 삽입되고 있음을 발견했습니다.\packages\Microsoft.넷.HTTP.2.0.20710.0\lib\net40\System.Net.Http.dll

그러나 이 프로젝트의 .sysroj 파일에 이 system.net .syslog.sys 파일의 경로는 다음과 같습니다.\packages\Microsoft.Net.Http.2.0.30506.0\lib\net40\System.Net.Http.dll

따라서 빌드가 이 경로 차이에서 실패하지만 TeamCity 빌드 서버가 아닌 개발자 시스템의 다른 곳에서 올바른 프레임워크 버전의 파일을 찾는 중입니다.

지금까지 우리가 발견한 차이점은 이것뿐입니다..csproj 파일의 경로를 변경하고 VS2013이 작동하는 로컬 Dev 시스템에 빌드해도 찾을 수 있습니다.

이제 버전 제어를 확인하고 (VS 2013을 로컬로 설치하지 않고) TeamCity 빌드 서버에서 솔루션의 NuGet 패키지 폴더에서 올바른 버전의 .vmdk를 찾고 다른 버전의 system.net .vmdk를 검색하는 대신 성공적으로 빌드합니다.dll 및 프레임워크와 일치하지 않는 최신 버전을 찾는 중이므로 빌드 오류가 발생합니다.

이게 도움이 될지 모르겠어요.

프로젝트 파일 경로에서 DLL을 확인하고 DLL의 패키지 폴더 경로와 일치하는지 확인합니다.

제게 효과가 있었던 것에 대한 다른 답들을 단순화하는 것입니다.

NuGet 관리자에게 가서 관련 패키지("Microsoft ASP.NET Web API 2.1 Client Libraries" 및 "Json")를 제거했습니다.NET")을 사용하여 다시 설치합니다.몇 번만 클릭하면 됩니다.

프로젝트를 닫고 다시 엽니다.그런 다음 Clean Solution + Build를 선택합니다.내게 적합함

버전 2.2.15.0의 경우 다음 작업을 수행했습니다.

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.2.15.0"/>
</dependentAssembly>

저도 똑같은 문제가 있었어요!VS의 Warning 탭을 살펴보니 nugget 패키지 중 하나가 간접적으로 참조하고 있었습니다.NET Framework 버전 4.5.0.0.0.이 패키지를 제거한 다음 4.0 버전을 다시 설치해야 하지만 4.0을 지원하는 패키지 버전을 지정해야 합니다(패키지를 설치할 때 지정하지 않으면 기본적으로 4.5로 돌아갑니다).이것이 도움이 되길 바랍니다!

배포 후 서버에서 이러한 현상이 발생했습니다.다음 중 하나에 의해 발생했습니다.

삭제되었어야 하는 bin 폴더의 오래된 파일이 아직 남아 있습니다.

또는

응용 프로그램 풀 ID 사용자의 폴더에 대한 읽기 권한이 없습니다.

즉, 사이트의 폴더에 대한 사용 권한을 수정하고 bin 폴더를 지우고 다시 배포함으로써 이 문제가 해결되었습니다.

Gembox.spreadsheet.dll 버전 31에서도 동일한 문제가 있었습니다.

파일 또는 어셈블리 'GemBox'를 로드할 수 없습니다.스프레드시트, 버전=39.3.30.1095, Culture=중립, 공개 키Token=b1b72c69714d4847' 또는 해당 종속성 중 하나입니다.위치한 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT: 0x80131040 예외)"

저는 이 기사들에서 거의 모든 것을 시도했지만 아무 것도 효과가 없었습니다.그것은 간단한 절차로 수리되었습니다.

기본적으로 DLL에 대한 올바른 버전 참조를 설정하는 개별 프로젝트를 구축하려고 시도했지만 솔루션에서 오류가 완전히 사라졌습니다.

유사한 문제를 해결하고 많은 댓글에 언급된 지침이 잘 작동했습니다.

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="2.0.0.0"/>
<dependentAssembly>

그러나 이전 버전의 적용 범위가 충분한지 확인해야 합니다. 그렇지 않으면 새 버전이 필요한 특정 버전으로 리디렉션되지 않을 수 있으며 이전 참조가 이미 bin 디렉터리에 있기 때문에 새 참조를 사용하는 위치가 제대로 작동하지 않습니다.

이 오류(및 유사한 오류)의 경우 NuGet Consolidate(Solution > Manage NuGet Packages...)를 수행하여 약간 오래된 버전이라도 다른 오래된 구성 요소에 종속될 수 있으므로 솔루션에서 참조되는 각 클래스 라이브러리에서 동일한 구성 요소 버전이 일관되도록 할 필요가 있습니다.업데이트와 함께 사용하는 것은 간단하며 많은 고통을 줄일 수 있습니다.

이를 통해 이 문제가 해결되었으며 MVC 또는 기타 웹 기반 NuGet 구성 요소를 참조하는 도우미 라이브러리를 만드는 경우 반드시 숙지해야 합니다.

언급URL : https://stackoverflow.com/questions/9431975/could-not-load-file-or-assembly-system-net-http-version-2-0-0-0-in-mvc4-web-ap

반응형