Onde está HttpContent.ReadAsAsync?


283

Eu vejo em vários exemplos na web usando o novo HttpClientobjeto (como parte da nova API da Web) que deve haver HttpContent.ReadAsAsync<T>método. No entanto, o MSDN não menciona esse método, nem o IntelliSense o encontra.

Para onde foi e como faço para solucionar isso?

Respostas:


436

Parece que é um método de extensão (em System.Net.Http.Formatting):

Classe HttpContentExtensions

Atualizar:

PM> pacote de instalação Microsoft.AspNet.WebApi.Client

De acordo com a página do pacote System.Net.Http.Formatting NuGet, o System.Net.Http.Formattingpacote agora é herdado e pode ser encontrado no Microsoft.AspNet.WebApi.Clientpacote disponível no NuGet aqui .


Isso foi descontinuado nos Nugets mais recentes do cliente? Não é possível encontrá-lo agora (costumava ser capaz).
Georgiosd #

Poderia muito bem ser. O .NET4.5 adicionou muitas coisas novas em relação a assíncronas / tarefas (aguardar, etc.), portanto essas extensões podem não ser mais necessárias. Talvez eu dê uma olhada aqui, por exemplo: msdn.microsoft.com/en-us/library/…
J ...

4
@georgiosd Acabei de atualizar a resposta. Enquanto isso, System.Net.Http.Formattingparece que foi movido para o pacote nuget.org/packages/Microsoft.AspNet.WebApi.Client .
Joseph Woodward

1
Portanto, é verdade que o método na pergunta original HttpContent.ReadAsAsync<T>, não está no Microsoft.AspNet.WebApi.Client? Qual é a substituição sugerida?
Patrick Szalapski

1
@JedatKinports Certeza que não. O pacote WebAPI.Client requer o .NET 4.5. Eu acho que o antigo HttpContentExtensions eram para .NET 4.0
J ...

68

Eu tenho o mesmo problema, então eu simplesmente recebo a string JSON e desserializo para a minha classe:

HttpResponseMessage response = await client.GetAsync("Products");
//get data as Json string 
string data = await response.Content.ReadAsStringAsync();
//use JavaScriptSerializer from System.Web.Script.Serialization
JavaScriptSerializer JSserializer = new JavaScriptSerializer();
//deserialize to your class
products = JSserializer.Deserialize<List<Product>>(data);

8
Além do fato de isso não responder à pergunta, por que isso foi rejeitado? Não é uma alternativa razoável para ReadAsAsync?
Jess

7
Com certeza é! +1!
Mrchief

7
provavelmente porque você não respondeu à pergunta de onde foi o método de extensão. Escrever o seu próprio é uma solução alternativa ruim
BritishDeveloper 29/04

13
Não é necessariamente uma solução alternativa ruim, está localizada e, portanto, provavelmente não será interrompida em futuras atualizações de nuget etc. Eu sou a favor.
rola

3
Isso pressupõe que a resposta tenha um tipo de conteúdo JSON.
CodeCaster

30

Se você já está usando Newtonsoft.Jsone não deseja instalar Microsoft.AspNet.WebApi.Client:

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());

9

Você pode escrever o método de extensão:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}

É o que acabei fazendo - não vou arrastar uma DLL inteira para um método de duas linhas.
Liz

5

Apenas clique com o botão direito do mouse no seu projeto e vá para Gerenciar Pacotes NuGet, procure Microsoft.AspNet.WebApi.Client e instale-o e você terá acesso ao método de extensão.


3
Quem está reclamando sobre o quê?
David Pfeffer

0

Depois de clicar nele algumas vezes e seguir várias sugestões, se você não o encontrar disponível após a instalação do NuGet Microsoft.AspNet.WebApi.Client, adicione manualmente uma referência da pasta packages na solução para:

\Microsoft.AspNet.WebApi.Client.5.2.6\lib\net45\System.Net.Http.Formatting.dll

E não caia na armadilha de adicionar referências mais antigas ao NuGet System.Net.Http.Formatting.dll

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.