ASP.NET Core를 사용하고 있습니다. 사용하고 HttpClient
싶지만 두 개의 NuGet 패키지가 제공되는 것을 확인했습니다. 어느 것을 사용합니까?
답변
버전에 따라 다릅니다. 이전 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
}
}
}
답변
이에 대한 더 많은 배경 지식에 관심이있는 사람을 위해 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의 기본 제공 버전을 선호하는 것이 좋습니다. “
답변
Microsoft.Net.Http
추가 Microsoft.Bcl
종속성이 필요합니다 .
이를 위해 .NET Framework 또는 .NET Core 만 대상으로하는 경우 사용하는 System.Net.Http
것이 좋습니다. 그렇지 않으면 Microsoft.Net.Http
다음 세대가 될 수 있으므로 더 나은 선택이 될 것입니다.