'System.Net.Http.HttpContent' no contiene una definición para 'ReadAsAsync' y ningún método de extensión

97

Hice una aplicación de consola para consumir una API web que acabo de hacer. El código de la aplicación de consola no se compila. Me da el error de compilación:

'System.Net.Http.HttpContent' does not contain a definition for 
'ReadAsAsync' and no extension method 'ReadAsAsync' accepting a 
first argument of type 'System.Net.Http.HttpContent' could be 
found (are you missing a using directive or an assembly reference?)

Aquí hay un método de prueba en el que se produce este error.

static IEnumerable<Foo> GetAllFoos()
{
  using (HttpClient client = new HttpClient())
  {
    client.DefaultRequestHeaders.Add("appkey", "myapp_key");

    var response = client.GetAsync("http://localhost:57163/api/foo").Result;

    if (response.IsSuccessStatusCode)
      return response.Content.ReadAsAsync<IEnumerable<Foo>>().Result.ToList();
  }

  return null;
}

He usado este método y lo consumí de un cliente MVC.

Enfriador de agua v2
fuente

Respuestas:

140

Después de una larga lucha, encontré la solución.

Solución: agregue una referencia a System.Net.Http.Formatting.dll. Este ensamblado también está disponible en la carpeta C: \ Archivos de programa \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

El método ReadAsAsynces un método de extensión declarado en la clase HttpContentExtensions, que está en el espacio System.Net.Httpde nombres de la biblioteca System.Net.Http.Formatting.

¡Reflector vino al rescate!

Enfriador de agua v2
fuente
7
¡Respuestas propias que ayudan a otros a sacudir los suburbios!
granadaCoder
¿Cómo conseguiste esa carpeta ahí? Usé el instalador de la plataforma web y no creó esa carpeta en Archivos de programa.
Bladefist
5
Agregar referencia -> Ensamblajes -> Extensiones. Si no aparece en la lista, vaya al cuadro Buscar ensamblados y escriba 'formateo'. Con suerte, le resultará más fácil.
FrankO
1
Una actualización, encontré la mía aquí: C: \ Archivos de programa (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph
6
nuget.org/packages/System.Net.Http.Formatting.Extension : ¿hay alguna razón para no usar esto?
WernerCD
93

Asegúrese de haber instalado la correct NuGet packageaplicación en su consola:

<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />

y que tiene como objetivo al menos .NET 4.0.

Dicho esto, su GetAllFoosfunción está definida para devolver un IEnumerable<Prospect>mientras que en su ReadAsAsyncmétodo está pasando IEnumerable<Foo>que obviamente no son tipos compatibles.

Install-Package Microsoft.AspNet.WebApi.Client

Seleccionar proyecto en la consola del administrador de proyectos

Darin Dimitrov
fuente
Gracias. Eso fue un desliz, un residuo de mi esfuerzo por eliminar el código relacionado con el negocio y reemplazarlo con Foos.
Water Cooler v2
No entiendo. Ya estoy apuntando al marco .NET 4.0 en las propiedades de mi aplicación de consola. ¿Necesito establecer una referencia a esta biblioteca Microsoft.AspNet.WebAPI.Client.dll? Nunca establecí ninguna referencia de este tipo en el proyecto ASP.NET MVC que también consume mi API web y funciona bien.
Water Cooler v2
5
Necesita instalar Microsoft.AspNet.WebApi.ClientNuGet. Esto descargará la última versión de Internet y hará referencia al ensamblado en su aplicación de consola. Eso es exactamente lo que hace la plantilla de proyecto ASP.NET MVC y es la razón por la que no necesita instalar nada para que funcione. Pero en su aplicación de consola no existe tal cosa.
Darin Dimitrov
1
Gracias. Hice lo que dijiste. Tengo 12 proyectos en mi solución, pero por alguna extraña razón, después de que dije 'install-package Microsoft.AspNet.WebApi.Client' en la consola de Library Package Manager, imprimió su traza habitual y luego dijo 'Microsoft.AspNet instalado con éxito .WebApi.Client en MyMVCProjectNameAndNotMyConsoleProjectName '. La próxima vez que seleccioné mi proyecto de consola y escribí lo mismo en la consola del administrador de paquetes. Dijo que MyMVCProjectName ya hace referencia a Microsoft.AspNet.WebApi.Client. Estoy confundido.
Water Cooler v2
Sí yo también. Empezar desde el principio. Nueva aplicación de consola, abra la consola NuGet, escriba Install-Package Microsoft.AspNet.WebApi.Clienty pruebe el código.
Darin Dimitrov
20
  • si no puede encontrar la referencia de ensamblaje desde cuándo (haga clic con el botón derecho en la referencia -> agregar el ensamblaje requerido)

pruebe esta consola del administrador de paquetes
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 y luego agregue usando agregar referencia.

Ganganath Rathnasekara
fuente
2
Estaba migrando la aplicación dotnetcore de 2.2 a 3.1 más reciente y encuentro este error. Mi aplicación ya tiene referencia a System.Net.Http.Formatting.Extension v5.2.3 pero mi aplicación se queja de este error, así que instalé el paquete nuget Microsoft.AspNet.WebApi .Cliente según lo sugerido por Rikin y Darin y después de que se resuelva el problema. Gracias
AKS
12

Agregar una referencia a System.Net.Http.Formatting.dll puede causar problemas de desajuste de DLL. En este momento, System.Net.Http.Formatting.dll parece hacer referencia a la versión 4.5.0.0 de Newtonsoft.Json.DLL, mientras que la última versión es 6.0.0.0. Eso significa que también deberá agregar una redirección de enlace para evitar una excepción de ensamblado .NET si hace referencia al último paquete o DLL de Newtonsoft NuGet:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
 </dependentAssembly> 

Entonces, una solución alternativa para agregar una referencia a System.Net.Http.Formatting.dll es leer la respuesta como una cadena y luego desearalizar usted mismo con JsonConvert.DeserializeObject (responseAsString). El método completo sería:

public async Task<T> GetHttpResponseContentAsType(string baseUrl, string subUrl)
{
     using (var client = new HttpClient())
     {
         client.BaseAddress = new Uri(baseUrl);
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

         HttpResponseMessage response = await client.GetAsync(subUrl);
         response.EnsureSuccessStatusCode();
         var responseAsString = await response.Content.ReadAsStringAsync();
         var responseAsConcreteType = JsonConvert.DeserializeObject<T>(responseAsString);
         return responseAsConcreteType;
      }
}
Conor Kelly
fuente
9

o si tiene VS 2012, puede ir a la consola del administrador de paquetes y escribir Install-Package Microsoft.AspNet.WebApi.Client

Esto descargaría la última versión del paquete.

RAM
fuente
Esto me lo arregló. - usando VS2013
Dan Rayson
si ya tiene un paquete Microsoft.AspNet.WebApi.Client, intente desinstalarlo e instalarlo, eso solucionó mi problema para la v 5.2.3
Naveen
-1

USE esta referencia de ensamblaje en su proyecto

Add a reference to System.Net.Http.Formatting.dll
Debendra Dash
fuente
6
La respuesta aceptada de enero de 2013 ya lo explica y tiene más información. Tu respuesta tampoco está formateada correctamente.
user247702