¿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?

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í .


¿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);

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());

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());
}

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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.