MVC4 Web API에서 파일 또는 어셈블리 'System.Net.Http, Version = 2.0.0.0을로드 할 수 없습니다.


92

이상한 문제가 있습니다.
MVC 4와 새로운 웹 API로 앱을 개발했으며 로컬에서 잘 작동합니다. 서버에 MVC4를 설치하고 앱을 배포했습니다. 이제 다음 오류가 발생합니다.

파일 또는 어셈블리 'System.Net.Http, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35'또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT에서 예외 : 0x80131040)

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

재미있게도 패키지 폴더 나 ASP.NET MVC 4 \ Assemblies 폴더에 로컬로있는 System.Net.Http의 버전은 1.0.0.0입니다. 실제로 내 프로젝트에서 System.Net.Http에 대한 참조를 제거했지만 여전히 동일한 메시지가 나타납니다. 2.0.0.0 참조를 어디에서 가져오고 왜 로컬에서 작동하지만 서버에서는 작동하지 않는지에 대해 약간 혼란 스럽습니다.

너겟 종속성 살펴보기 :

ASP.NET WEb API 코어 라이브러리 (베타)는 System.Net.Http.Formatting에 의존합니다.
그리고 System.Net.Http.Formatting은 System.Net.Http에 따라 다릅니다.
나는 이것이 이것이 어디에서 오는지 생각합니다. 하지만이 패키지의 버전 2.0.20126.16343이 설치되어 있습니다. 내부의 dll에 버전 1.0.0.0이 있습니다.

내가 뭔가를 놓치고 있습니까?

최신 정보:

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


이 프로젝트에 "배포 가능한 종속성 추가"기능을 사용하셨습니까?
ChristiaanV

아뇨, 시도하지 않았습니다. 하지만 모든 것을 새로 설정했고 이제 작동합니다 ....별로 만족
Remy

컴퓨터를 다시 시작하고 Visual Studio를 다시 시작할 때마다이 문제가 발생합니다. 어떻게 든 청소하고 솔루션을 다시 빌드하면 사라졌습니다.
frostshoxx

답변:


30

appharbor에 내 앱을 배포하는 데 동일한 문제가 발생했습니다. 아직 .NET 4.5를 지원하지 않는 문제. 제가 한.

  1. 내 프로젝트를 .NET 4.0 프로필로 전환했습니다.
  2. Web API NuGet 패키지를 제거했습니다.
  3. Web API (베타) NuGet 패키지를 다시 설치했습니다.
  4. .csproj 파일에 모든 참조 어셈블리가 포함되어 있는지 확인하여 항상 GAC 대신 Bin 폴더에서 가져옵니다.

1
어떻게 든 내 프로젝트가 작동하기 시작했지만 왜 그런지 모르겠습니다. 당신의 접근 방식이 타당 해 보입니다.
레미

alexanderb-.NET 4.0 프로필로 어떻게 변경합니까? Visual Studio에서? bin 폴더는 어디에 있습니까? .csproj 파일이 web.config 파일입니까? 들으
을 WhoAmI

114

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>

이제 매력처럼 작동합니다.


4
이 변경으로 어셈블리를 로컬로 복사하도록 설정해야합니까?
Rasmus Christensen

3
나에게 문제는 내 Web Api NuGet 패키지 중 하나가 System.Net.Http 2.0.0.0에 대한 종속성을 가지고 있었지만 내 참조가 내 bin 폴더에 출력되는 2.1.10.0이었습니다.
JustinMichaels

2
이것은 정확합니다 (Justin Michaels가 말했듯이). 종속성은 2.0.0.0을 참조하지만 어셈블리 참조는 2.1.xx입니다.이 문제를 해결하려면 바인딩 리디렉션 만 있으면됩니다.
Tod Thomson

2
이것은 정답으로 표시되어야합니다. 이것이 다른 모든 사용자가이 옵션을 추진하는 이유라고 생각합니다. 감사합니다, Krzysztof!
Blaise

3
문제는 아마도 System.Net.Http에 대한 직접 참조가 아니라 참조하는 다른 라이브러리 중 하나에서 사용되는 간접 참조 일 것입니다. 그렇기 때문에 일반적으로 로컬 복사를 설정해도이 문제가 해결되지 않습니다.
Paul Keister 2013 년

10

내 작업 :

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>

나는 뭔가 likethis을했지만 나는 4.0.0.0에 NEWVERSION를 업데이트 0.0.0.0-2.0.0.0로 oldVersion 왼쪽
Veritoanimus

2

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

이것은 현재 nuget에서 관리하는 라이브러리 중 하나입니다. 따라서 Nuget을 열고 모든 것이 최신 상태인지 확인하십시오. 그리고 프로젝트 패키지 디렉토리에 파일이 있어야합니다. \packages\System.Net.Http.2.0.20126.16343\lib\net40

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


1
사실 그게 저를 혼란스럽게합니다. 나는 너겟을 사용하고이 폴더가 있습니다. 하지만 System.Net.Http를 보면 버전 1.0.0.0
Remy

1
이것이 바로 내가 고친 방법입니다! 모두 로컬에서 작동했기 때문에. 나는 바로 참조를 클릭하고 속성에서 나는 설정 Copy local진정한 그것을 해결하는! web.config 파일에서 더 쉽고 / 낫습니다. bin 폴더에 dll을 추가하기 만하면됩니다.
JP Hellemons 2013 년

2

제 경우에는 훨씬 더 쉬운 방법으로 수정했습니다. 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" />

1

제 경우에는 NuGet을 통해 실수로 System.Net.Http 버전 2.1.10.0에 종속성을 추가했습니다. NuGet 패키지 관리자에서 제거 할 수 없습니다 (다른 패키지가 종속 된 것처럼 보였기 때문). 그러나 이러한 패키지는이 특정 버전에 종속되지 않습니다. 이를 제거하기 위해 내가 한 작업은 다음과 같습니다 (대신 NuGet 콘솔을 사용할 수도 있습니다 (–force 매개 변수 사용).

  • packages.config의 Microsoft.Net.Http 버전을 2.1.10.0에서 2.0.0.0으로 변경
  • NuGet 패키지 관리자에서 BCL 이식성 팩 제거
  • 종속 라이브러리 (버전 2.1.10.0이있는 System.Net.Http. *)를 수동으로 제거
  • System.Net.Http 2.0.0.0에 대한 참조 추가

1

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

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

이제 잘 작동합니다.


XML 태그를 올바르게 표시하려면 텍스트 형식을 코드로 지정하십시오. 이를 위해 각 줄 앞에 공백 4 개를 추가하면됩니다.
Artemix 2013

Tnx Artemix, 이것은 내 첫 번째 댓글입니다.)
StefanoM5

1

배포를 위해 "준비된"것으로 추정되는 테스트 서버 (Windows 2008 R2)에서이 문제에 직면했습니다.)

힌트는 DEV 컴퓨터와 배포 서버 사이의 System.net 버전을 확인했을 때 일치하지 않는다는 것입니다.

아래 단계를 사용하여 수정했습니다.

  1. 여기 에서 .NET Framework 4.5 독립 실행 형 설치 프로그램을 다운로드했습니다.

  2. 배포 머신에서 설치 프로그램을 실행했습니다.

프레임 워크 설치 후, 서버는 재부팅을 원했고, 그렇게했고 volla! 우리는 갈 수 있습니다!


1

우리는 VS 2013을 사용하고 있으며 새로운 MVC 4 웹 API를 만들었으며 TeamCity 서버에서 빌드 할 때 system.net.http.dll이 올바른 버전이 아닌 문제가 있었지만 VS 2013이있는 로컬 개발자 컴퓨터에서 잘 빌드됩니다. 설치되었습니다.

우리는 마침내 문제를 결정했습니다.

새 MVC 4 웹 API를 만들고 프로젝트 생성시 프레임 워크 4.0을 선택할 때 DLL에 대한 올바른 NuGet 패키지 버전이 .. \ packages \ Microsoft.Net.Http.2.0.20710.0 \ lib \ net40 \ System.Net.Http.dll

그러나이 프로젝트의 .csproj 파일에 따르면이 system.net.http.dll 파일의 경로는 .. \ packages \ Microsoft.Net.Http.2.0.30506.0 \ lib \ net40 \ System.Net.Http.dll입니다.

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

지금까지 이것이 우리가 찾은 유일한 차이점입니다. .csproj 파일의 경로를 변경하고 VS2013을 사용하여 로컬 Dev 컴퓨터에서 빌드하면 여전히 찾을 수 있습니다.

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

이것이 도움이되는지 확실하지 않습니다.

DLL의 프로젝트 파일 경로를 확인하고 DLL의 패키지 폴더 경로와 일치하는지 확인하십시오.


1

나를 위해 일한 것에 대한 다른 답변을 단순화했습니다.

NuGet 관리자로 이동하여 관련 패키지 (제 경우에는 "Microsoft ASP.NET Web API 2.1 클라이언트 라이브러리"및 "Json.NET")를 제거하고 다시 설치했습니다. 몇 번의 클릭 만하면됩니다.


0

프로젝트를 닫고 다시 엽니 다. 그런 다음 Clean Solution + Build. 나를 위해 작동


0

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

0

나는 똑같은 문제가 있었다! VS의 경고 탭을 살펴본 결과 내 nuget 패키지 중 하나가 .NETFramework 버전 4.5.0.0을 간접적으로 참조하고 있음을 알았습니다. 이 패키지를 제거한 다음 4.0 버전을 다시 설치해야했지만 4.0을 지원하는 패키지 버전을 지정해야합니다 (패키지를 설치할 때 지정하지 않으면 기본값은 4.5로 돌아갑니다). 도움이 되었기를 바랍니다!


0

배포 후 서버에서 이런 일이 발생했습니다. 원인은 다음 중 하나입니다.

A) 삭제해야 할 빈 폴더의 오래된 파일이 여전히 매달려 있습니다.

또는

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

즉, 사이트의 폴더에 대한 권한을 수정하고 bin 폴더를 지우고 다시 배포하여이 문제를 해결했습니다.


0

Gembox.spreadsheet.dll 버전 31에서 동일한 문제가 발생했습니다.

"파일 또는 어셈블리 'GemBox.Spreadsheet, 버전 = 39.3.30.1095, Culture = neutral, PublicKeyToken = b1b72c69714d4847'또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT 예외 : 0x80131040 ) "

이 기사에서 거의 모든 것을 시도했지만 아무것도 작동하지 않았습니다. 간단한 단계로 해결되었습니다.

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


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>

그러나 이전 버전 범위가 충분히 높은지 확인해야합니다. 그렇지 않으면 최신 버전이 필요한 특정 버전으로 리디렉션되지 않을 수 있으며 이전 참조가 이미 bin 디렉토리에 있으므로 최신 참조를 사용하는 위치가 제대로 작동하지 않습니다.


0

이 오류 (및 유사)의 경우 NuGet Consolidate (솔루션> NuGet 패키지 관리 ...)를 통해 솔루션에서 참조하는 각 클래스 라이브러리에서 동일한 참조 구성 요소 버전이 일관되도록하는 것이 좋습니다. 약간 오래된 버전에도 종속성이있을 수 있기 때문입니다. 다른 이전 구성 요소에서. 업데이트와 함께 사용하는 것은 간단하며 많은 고통을 줄일 수 있습니다.

이것은 나를 위해이 문제를 해결했으며 MVC 또는 기타 웹 기반 NuGet 구성 요소도 참조하는 도우미 라이브러리를 만드는 경우 익숙해 져야한다고 말하고 싶습니다.

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