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?

David Pfeffer
fonte

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 .

J ...
fonte
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);
rosta
fonte
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());
Martin Brandl
fonte
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());
}
Vasya Milovidov
fonte
É 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.

Ivan Carmenates García
fonte
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

Tom John
fonte