¿Dónde está HttpContent.ReadAsAsync?

283

Veo en toneladas de ejemplos en la web usando el nuevo HttpClientobjeto (como parte de la nueva API web) que debería haber un HttpContent.ReadAsAsync<T>método. Sin embargo, MSDN no menciona este método, ni IntelliSense lo encuentra.

¿A dónde fue y cómo puedo solucionarlo?

David Pfeffer
fuente

Respuestas:

436

Parece que es un método de extensión (en System.Net.Http.Formatting):

Clase HttpContentExtensions

Actualizar:

PM> paquete de instalación Microsoft.AspNet.WebApi.Client

Según la página del paquete System.Net.Http.Formatting NuGet, el System.Net.Http.Formattingpaquete ahora es heredado y se puede encontrar en el Microsoft.AspNet.WebApi.Clientpaquete disponible en NuGet aquí .

J ...
fuente
¿Ha quedado en desuso en los últimos Nugets de clientes? No puedo encontrarlo ahora (solía poder).
georgiosd el
Bien podría ser. .NET4.5 agregó muchas cosas nuevas con respecto a las tareas / asíncronas (espera, etc.), por lo que estas extensiones pueden no ser necesarias. Quizás echaría un vistazo aquí, por ejemplo: msdn.microsoft.com/en-us/library/…
J ...
44
@georgiosd Acabo de actualizar la respuesta. Mientras tanto, System.Net.Http.Formattingparece que se movió al paquete nuget.org/packages/Microsoft.AspNet.WebApi.Client .
Joseph Woodward
1
Entonces, ¿es cierto que el método en la pregunta original HttpContent.ReadAsAsync<T>no está en Microsoft.AspNet.WebApi.Client? ¿Cuál es el reemplazo sugerido?
Patrick Szalapski
1
@JedatKinports Seguro que no. El paquete WebAPI.Client requiere .NET 4.5. Creo que las antiguas HttpContentExtensions eran para .NET 4.0
J ...
68

Tengo el mismo problema, así que simplemente obtengo una cadena JSON y deserializo a mi clase:

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
fuente
8
Además del hecho de que esto no responde a la pregunta, ¿por qué fue rechazado? ¿No es una alternativa razonable a ReadAsAsync?
Jess
77
¡Seguro que lo es! +1!
Mrchief
77
probablemente porque no respondiste a la pregunta de dónde fue el método de extensión. Escribir el suyo es una solución alternativa pobre
BritishDeveloper
13
No es necesariamente una solución alternativa deficiente, está localizado y, por lo tanto, no es probable que se rompa en futuras actualizaciones de Nuget, etc. Estoy a favor.
rueda
3
Esto supone que la respuesta tiene un tipo de contenido JSON.
CodeCaster
30

Si ya está utilizando Newtonsoft.Jsony no desea instalar Microsoft.AspNet.WebApi.Client:

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

Puedes escribir el método de extensión:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}
Vasya Milovidov
fuente
Es lo que terminé haciendo: no voy a arrastrar una DLL completa para un método de 2 líneas.
Liz
5

Simplemente haga clic derecho en su proyecto, vaya a Administrar paquetes NuGet, busque Microsoft.AspNet.WebApi.Client, instálelo y tendrá acceso al método de extensión.

Ivan Carmenates García
fuente
3
¿Quién se queja de qué?
David Pfeffer
0

Después de haberlo golpeado varias veces y seguido un montón de sugerencias, si no lo encuentra disponible después de instalar NuGet Microsoft.AspNet.WebApi.Client, agregue manualmente una referencia de la carpeta de paquetes en la solución para:

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

Y no caiga en la trampa de agregar referencias antiguas al System.Net.Http.Formatting.dll NuGet

Tom John
fuente