System.Net.Http 대 Microsoft.Net.Http


86

ASP.NET Core를 사용하고 있습니다. 사용하고 HttpClient싶지만 두 개의 NuGet 패키지가 제공되는 것을 확인했습니다. 어느 것을 사용합니까?


System.Net.Http따라 달라집니다 Microsoft.Net.Http. 그러나 다시 말하지만, 애플리케이션으로 무엇을 하려는지에 따라 다릅니다.
John Odom

답변:


64

버전에 따라 다릅니다. 이전 System.Net.Http패키지 ( 2.0 패키지 )는 Microsoft.Http.Net설명 에 따라 더 이상 사용되지 않는 레거시 패키지입니다 .

레거시 패키지 인 System.Net.Http는 이제 'Microsoft.Net.Http'패키지에 포함됩니다.

HttpClient이전 .NET 버전 및 Portable Class 라이브러리 를 제공하기 위해 존재합니다 . Microsoft.Net.Http이 경우에 사용해야합니다 .

.NET Core를 사용하고 있으므로 최신 System.Net.Http패키지 (예 : 4.3.3)를 사용해야합니다 .

csproj 업데이트

.NET Standard 2.0부터 System.Net.HttpClient패키지는 이미 포함되어 있으며 netstandard2.0. 어떤 이유로 든 전체 .NET 및 .NET Core 모두에 대해 계속 참조하려는 경우 csproj 파일에 다음을 추가 할 수 있습니다.

<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <!-- // HttpClient for full .NET -->
    <Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <!-- // HttpClient for .NET Core -->
    <PackageReference Include="System.Net.Http" Version="4.3.3" />
</ItemGroup>

project.json을 사용하는 경우

project.json이 전체 .NET 및 .NET Core를 모두 대상으로하는 경우 System.Net.Http어셈블리를 frameworkAssemblies요소 에 추가 해야합니다 . 예를 들면 :

"frameworks": {
  "net451": {
    "frameworkAssemblies": {
      "System.Net.Http": "4.0.0.0" // HttpClient for full .NET
    }
  },
  "netstandard1.3": {
    "dependencies": {
      "System.Net.Http": "4.1.0", // HttpClient for .NET Core
    }
  }
}

1
그들은 똑같은 행동을하지 않는다는 점에 유의하십시오. 전체 .NET 버전 (4.0.0.0)은 자동 압축을 수행하지 않는 반면 .NET Core 버전 (4.1.0)은 자동 압축을 수행합니다. 따라서 전체 .NET 버전을 사용하는 경우 gzip / deflate 압축을 사용하도록 핸들러를 수동으로 구성해야합니다. 설명 : github.com/dotnet/docs/issues/1054
Jeppe Andersen

28
이 답변은 .NET Core, .NET Standard 및 .NET Framework에서 이것이 엉망이 된 것을 요약합니다.
Vincent

1
@vincent 사람들이 모노 등을 사용할 때 허리보다 엉덩이가 더 이상 고통스럽지 않습니다. 멀티 플랫폼에는 항상 몇 가지 고통 포인트가 있습니다.
롤백

4
"레거시 패키지 System.Net.Http가 이제 패키지에 포함되었습니다 Microsoft.Net.Http." 가 표시되지 않습니다 . 패키지 설명에서 언급하는 언어. 실제로 System.Net.Http패키지는 가장 최근에 업데이트 된 것으로 보입니다 (몇 년까지)
Dan Esparza

2
@DanEsparza 내가 게시 한 링크 를 보면 메시지가 표시됩니다. 또한 이전 패키지 (2.0 패키지) 만 더 이상 사용되지 않는다고 언급했습니다 . 최신 4.xx 패키지는 실제로 최신 패키지이므로 사용해야합니다.
Henk Mollema

19

이에 대한 더 많은 배경 지식에 관심이있는 사람을 위해 Immo Landwerth (Microsoft의 .NET 프로그램 관리자) 는 이에 대해 트윗 했습니다.

"HttpClient는 NuGet 패키지 (대역 외)로 시작했으며 4.5에서도 .NET Framework에 추가되었습니다 (기본 제공).

.NET Core / .NET Standard를 사용하여 원래 .NET 플랫폼을 인 박스와 아웃 오브 밴드가 더 이상 중요하지 않은 패키지 세트로 모델링하려고했습니다. 그러나 이것은 우리가 예상했던 것보다 더 지저분하고 복잡했습니다.

그 결과 Core / Standard 2.0을 사용하여 .NET 플랫폼을 NuGet 그래프로 모델링하는 아이디어를 대부분 포기했습니다.

일반적인 대답은 다음과 같습니다.

.NET Core 2.0 및 .NET Standard 2.0을 사용하면 SystemNetHttpClient NuGet 패키지를 전혀 참조 할 필요가 없습니다. 그래도 1.x 종속성에서 가져올 수 있습니다.

.NET Framework도 마찬가지입니다. 4.5 이상을 대상으로하는 경우 일반적으로 NuGet 패키지 대신 기본 제공 버전을 사용해야합니다. 다시 말하지만, .NET Standard 1.x 및 PCL 종속성을 위해 끌어 올 수 있지만 .NET Framework에 대해 직접 작성된 코드는이를 사용해서는 안됩니다.

그렇다면 패키지가 여전히 존재하는 이유 / 업데이트하는 이유는 무엇입니까? 단순히 우리는 그것에 의존하는 기존 코드를 작동시키고 싶기 때문입니다. 그러나 .NET Framework에서는 이것이 순조롭게 진행되지 않는다는 것을 알게되었습니다.

레거시 패키지의 의도 된 모델은 다음과 같습니다. .NET Framework 4.5+, .NET Core 2+, .NET Standard 2+에서 패키지를 사용하는 경우 패키지는 자체 버전을 가져 오는 대신 플랫폼 제공 구현으로 만 전달합니다.

모든 경우에 실제로 발생하는 것은 아닙니다. 일부 고객에게는 작동하고 다른 고객에게는 실패하는 .NET Framework의 기본 구성 요소를 HTTP 클라이언트 패키지가 (부분적으로) 대체합니다. 따라서 지금은 쉽게 문제를 해결할 수 없습니다.

또한 .NET Framework에는 일반적인 바인딩 문제가 있으므로 바인딩 리디렉션을 추가하는 경우에만 제대로 작동합니다. 예이!

따라서 라이브러리 작성자는이 패키지에 대한 종속성을 피하고 .NET Framework 4.5, .NET Core 2.0 및 .NET Standard 2.0의 기본 제공 버전을 선호하는 것이 좋습니다. "

https://twitter.com/terrajobst/status/997262020108926976


8

Microsoft.Net.Http추가 Microsoft.Bcl종속성이 필요합니다 .

이를 위해 .NET Framework 또는 .NET Core 만 대상으로하는 경우 사용하는 System.Net.Http것이 좋습니다. 그렇지 않으면 Microsoft.Net.Http다음 세대가 될 수 있으므로 더 나은 선택이 될 것입니다.


8
MS가 ...이 게시물을 암시로 자신의 마음을 변경 것 같다 stackoverflow.com/questions/39016373/... system.net.http 불과 몇 개월 사고 (nuget) 동안 microsoft.net.http 2015 년 이후 업데이트되지 않은 .
smoore4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.