System.Net.Http vs Microsoft.Net.Http


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

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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.