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