System.Net.Http vs Microsoft.Net.Http

86

Estou usando o ASP.NET Core. Eu quero usar, HttpClientmas percebi que há dois pacotes NuGet sendo oferecidos. Qual eu uso?

Muhammad Rehan Saeed
fonte
Parece que System.Net.Httpdepende de Microsoft.Net.Http. Mas, novamente, depende do que você está tentando fazer com seu aplicativo.
John Odom

Respostas:

64

Depende da versão. Os System.Net.Httppacotes antigos (os 2.0 ) são pacotes legados que estão obsoletos de Microsoft.Http.Netacordo com a descrição:

O pacote legado, System.Net.Http, agora está incluído no pacote 'Microsoft.Net.Http'.

Eles existem para fornecer as HttpClientversões anteriores do .NET e bibliotecas de classes portáteis. Você deve usar Microsoft.Net.Httpnesse caso.

Como está usando o .NET Core, você deve usar o System.Net.Httppacote mais recente (por exemplo, 4.3.3).

Atualizado para csproj

A partir do .NET Standard 2.0, o System.Net.HttpClientpacote já está incluído e disponível quando você direcionar netstandard2.0. Se, por algum motivo, você ainda quiser referenciá-lo para .NET completo e .NET Core, poderá adicioná-lo ao seu arquivo 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>

Se você estiver usando project.json

Se o seu project.json for direcionado para .NET e .NET Core completos, você terá que adicionar o System.Net.Httpassembly ao frameworkAssemblieselemento. Por exemplo:

"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
    }
  }
}
Henk Mollema
fonte
1
Esteja ciente de que eles não têm exatamente o mesmo comportamento. A versão .NET completa (4.0.0.0) não faz compactação automática, enquanto a versão .NET Core (4.1.0) faz. Portanto, se você usar a versão .NET completa, deverá configurar manualmente o manipulador para usar a compactação gzip / deflate. Descrição: github.com/dotnet/docs/issues/1054
Jeppe Andersen
28
Essa resposta resume a bagunça que isso se tornou com o .NET Core, .NET Standard e .NET Framework.
Vincent
1
@vincent Não é mais chato do que atrás quando as pessoas usavam mono, etc. Multiplataforma sempre tem alguns pontos fracos.
rola em
4
Não vejo o "pacote Legacy, System.Net.Httpagora está incluído no Microsoft.Net.Httppacote." idioma ao qual você está se referindo na descrição do pacote. Na verdade, o System.Net.Httppacote parece ter sido atualizado mais recentemente (por vários anos)
Dan Esparza
2
@DanEsparza se você olhar o link que postei , verá a mensagem. Eu também mencionei que apenas os pacotes antigos (os 2.0) estão obsoletos. Os pacotes 4.xx mais recentes são de fato os mais novos e você deve usá-los.
Henk Mollema
19

Para qualquer pessoa interessada em mais informações sobre isso, Immo Landwerth (gerente de programa em .NET na Microsoft) tuitou sobre isso:

"O HttpClient começou como um pacote NuGet (fora da banda) e foi adicionado ao .NET Framework no 4.5 também (na caixa).

Com o .NET Core / .NET Standard, originalmente tentamos modelar a plataforma .NET como um conjunto de pacotes em que estar dentro da caixa ou fora da banda não importava mais. No entanto, isso foi mais confuso e complicado do que prevíamos.

Como resultado, abandonamos em grande parte a ideia de modelar a plataforma .NET como um gráfico NuGet com Core / Standard 2.0.

A resposta geral é:

Com o .NET Core 2.0 e .NET Standard 2.0, você não precisa fazer referência ao pacote SystemNetHttpClient NuGet. No entanto, ele pode ser retirado das dependências 1.x.

O mesmo vale para o .NET Framework: se você pretende 4.5 e superior, geralmente deve usar a versão na caixa em vez do pacote NuGet. Novamente, você pode acabar puxando-o para dependências do .NET Standard 1.xe PCL, mas o código escrito diretamente no .NET Framework não deve usá-lo.

Então, por que o pacote ainda existe / por que ainda o atualizamos? Simplesmente porque queremos fazer o código existente funcionar que dependeu dele. No entanto, como você descobriu, isso não é fácil no .NET Framework.

O modelo pretendido para o pacote legado é: se você consumir o pacote do .NET Framework 4.5+, .NET Core 2+, .NET Standard 2+, o pacote apenas encaminha para a implementação fornecida pela plataforma, em vez de trazer sua própria versão.

Porém, isso não é o que realmente acontece em todos os casos: o pacote do cliente HTTP substituirá (parcialmente) os componentes embutidos no .NET Framework que funcionam para alguns clientes e falham para outros. Portanto, não podemos resolver o problema facilmente agora.

Além disso, temos os problemas usuais de vinculação com o .NET Framework, portanto, isso só funciona bem se você adicionar redirecionamentos de vinculação. Yay!

Portanto, como autor de uma biblioteca, minha recomendação é evitar depender desse pacote e preferir as versões embutidas no .NET Framework 4.5, .NET Core 2.0 e .NET Standard 2.0. "

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

Dan Diplo
fonte
8

Microsoft.Net.Httprequer Microsoft.Bcldependências adicionais .

Para isso, se você está direcionado apenas ao .NET Framework ou .NET Core, System.Net.Httpestá pronto para prosseguir. Caso contrário, Microsoft.Net.Httpseria a melhor escolha, pois poderia ser a próxima geração.

Youngjae
fonte
8
Parece que a MS mudou de ideia, pois esta postagem alude a ... stackoverflow.com/questions/39016373/… microsoft.net.http não foi atualizado desde 2015, enquanto system.net.http está apenas alguns meses sago (nuget) .
smoore4