HttpClient no admite el método PostAsJsonAsync C #

255

Estoy tratando de llamar a una API web desde mi aplicación web. Estoy usando .Net 4.5 y mientras escribo el código obtengo el error HttpClientno contiene un PostAsJsonAsyncmétodo de definición .

Debajo está el código:

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:51093/");
client.DefaultRequestHeaders.Accept.Add(
   new MediaTypeWithQualityHeaderValue("application/json"));
var user = new Users();
user.AgentCode = 100;
user.Remarks = "Test";
user.CollectionDate = System.DateTime.Today;
user.RemittanceDate = System.DateTime.Today;
user.TotalAmount = 1000;
user.OrgBranchID = 101;

var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;

y recibo el mensaje de error:

Error: 'System.Net.Http.HttpClient' no contiene una definición para 'PostAsJsonAsync' y no se puede encontrar ningún método de extensión 'PostAsJsonAsync' que acepte un primer argumento de tipo 'System.Net.Http.HttpClient' (falta un usando una directiva o una referencia de ensamblaje?)

Por favor, eche un vistazo y me aconseje.

Jidheesh Rajan
fuente
14
La mejor opción es agregar el paquete "Microsoft.AspNet.WebApi.Client" .Nuget. ¡Eso es!
Sachin Pawar

Respuestas:

435

Sí, necesita agregar una referencia a

System.Net.Http.Formatting.dll

Esto se puede encontrar en el área de ensambles de extensiones.

Una buena manera de lograr esto es agregando el paquete NuGetMicrosoft.AspNet.WebApi.Client a su proyecto.

Justin Harvey
fuente
77
Ahora recibo un error: "No se pudo cargar el archivo o ensamblado 'Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' o una de sus dependencias. El sistema no puede encontrar el archivo especificado".
Jidheesh Rajan
89
Descubrí que tenía que agregar el paquete NuGet "Microsoft.AspNet.WebApi.Client" para asegurar que la versión del dll de formato funcionara con la versión de .NET framework de "System.Net.Http" en mi proyecto.
Todd H.
27
¿Por qué hacer referencia a un ensamblaje de sistema estándar requiere que descargue material de código abierto desde ubicaciones aleatorias en Internet para que funcione? ¿Por qué esto incluso compila si no puede resolver sus dependencias? ¡Esto me irrita sin fin!
Neutrino
44
@Neutrino ¿Prefieres escribir el código tú mismo? Usted debe estar agradecido de que la gente de Microsoft y en otros lugares han escrito código que puede utilizar de forma gratuita
reggaeguitar
44
PM> Install-Package System.Net.Http.Formatting.Extension
Yar
194

PostAsJsonAsyncya no está en System.Net.Http.dll(.NET 4.5.2). Puede agregar una referencia a System.Net.Http.Formatting.dll, pero en realidad pertenece a una versión anterior. Me encontré con problemas con esto en nuestro servidor de compilación TeamCity, estos dos no cooperarían juntos.

Alternativamente, puede reemplazar PostAsJsonAsynccon una PostAsyncllamada, que es solo parte de la nueva DLL. Reemplazar

var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;

Con:

var response = client.PostAsync("api/AgentCollection", new StringContent(
   new JavaScriptSerializer().Serialize(user), Encoding.UTF8, "application/json")).Result;

Tenga en cuenta que JavaScriptSerializerestá en el espacio de nombres: System.Web.Script.Serialization.

Deberá agregar una referencia de ensamblaje en su csproj: System.Web.Extensions.dll

Ver https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836

Jeroen K
fuente
77
Esta debería ser la respuesta. La mejor manera de hacer algo es la forma correcta de hacerlo
Alireza
44
Esta es la mejor respuesta hasta ahora. No intente agregar paquetes NuGet o dlls.
Gökhan Kurt
3
Totalmente la mejor respuesta. Respuesta seleccionada no es una buena práctica en absoluto , de hecho, Microsoft no recomienda a las DLL de referencia
Astaar
44
Fuera de tema, pero quiero mencionarlo de todos modos: use en await FooAsync()lugar de FooAsync().Result. Este último puede llegar a un punto muerto. Consulte stackoverflow.com/q/17248680/2272514 y su respuesta aceptada. También hay buenos enlaces sobre detalles.
Thomas Schreiter
2
Para usar un tipo en lugar de "application / json", puede usar MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit
164

La referencia que falta es la System.Net.Http.Formatting.dll. Pero la mejor solución es agregar el paquete NuGet Microsoft.AspNet.WebApi.Clientpara asegurar que la versión del dll de formato funcionó con la versión de .NET Framework de System.Net.Httpmi proyecto.

Todd H.
fuente
1
@Yuval: ahora me doy cuenta de que la "solución" que sugerí sonaba como un comentario. Resulta que Andreo es autor del paquete NuGet que sugerí.
Todd H.
Esta fue la respuesta para mí! (a mi pregunta)
JenonD
34

Como ya se debatió, este método ya no está disponible desde .NET 4.5.2. Para ampliar la respuesta de Jeroen K, puede hacer un método de extensión:

public static async Task<HttpResponseMessage> PostAsJsonAsync<TModel>(this HttpClient client, string requestUrl, TModel model)
{
    var serializer = new JavaScriptSerializer();
    var json = serializer.Serialize(model);
    var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
    return await client.PostAsync(requestUrl, stringContent);
}

Ahora puedes llamar client.PostAsJsonAsync("api/AgentCollection", user).

Christian Gollhardt
fuente
12

También tuve este problema en un proyecto que acababa de sacar del control de código fuente.

El síntoma fue el error descrito anteriormente y un triángulo de advertencia amarillo en una referencia a System.Net.Http.Formatting

Para solucionar esto, eliminé la referencia rota y luego usé NuGet para instalar la última versión de Microsoft.AspNet.WebApi.Client.

Señor risitas
fuente
2
¡Funciona! Para instalar mediante Nuget Console, ingreseInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Sé que esta respuesta es demasiado tarde, tuve el mismo problema y estaba agregando el System.Net.Http.Formatting.ExtensionNuget, después de verificar aquí y allá encontré que el Nuget se agregó pero System.Net.Http.Formatting.dllno se agregó a las referencias, simplemente reinstalé el Nuget

Abed Kaff
fuente
3

Intente instalar en su proyecto el paquete NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client
Alexandre Spreafico Novaes
fuente
2

En lugar de escribir esta cantidad de código para hacer una llamada simple, puede usar uno de los contenedores disponibles en Internet.

He escrito uno llamado WebApiClient, disponible en NuGet ... ¡échale un vistazo!

https://www.nuget.org/packages/WebApiRestService.WebApiClient/

Andreo Romera
fuente
@Andreo El enlace ( webapiclient.azurewebsites.net ) ahora está roto como el 30 de noviembre de 2017. El enlace de trabajo de NuGet es nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G
Desafortunadamente, Microsoft ha finalizado mi suscripción azul y la url ya no es válida :(
Andreo Romera
2

Si estás jugando en Blazor y obtienes el error, debes agregar el paquete Microsoft.AspNetCore.Blazor.HttpClient.

Briseida
fuente
0

Simplemente expandiendo la respuesta de Jeroen con los consejos en los comentarios:

var content = new StringContent(
    JsonConvert.SerializeObject(user), 
    Encoding.UTF8, 
    MediaTypeNames.Application.Json);

var response = await client.PostAsync("api/AgentCollection", content);
Haga clic en Aceptar
fuente