322 votes

HttpClient ne supporte pas la méthode PostAsJsonAsync en C#

Je cherche à appeler une API web depuis mon application web. J'utilise .Net 4.5 et en écrivant le code, je reçois l'erreur HttpClient ne contient pas de méthode de définition PostAsJsonAsync.

Voici le code:

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;

et je reçois le message d'erreur:

Erreur: 'System.Net.Http.HttpClient' ne contient pas de définition pour 'PostAsJsonAsync' et aucune méthode d'extension 'PostAsJsonAsync' acceptant un premier argument de type 'System.Net.Http.HttpClient' n'a pu être trouvée (avez-vous oublié une directive using ou une référence d'assembly?)

Veuillez jeter un œil et me conseiller.

553voto

Justin Harvey Points 6105

Oui, vous devez ajouter une référence à

System.Net.Http.Formatting.dll

Cela peut être trouvé dans la zone des assemblies d'extensions.

Une bonne manière d'y parvenir est d'ajouter le paquet NuGet Microsoft.AspNet.WebApi.Client à votre projet.

242voto

Jeroen K Points 1647

PostAsJsonAsync n'est plus dans le fichier System.Net.Http.dll (.NET 4.5.2). Vous pouvez ajouter une référence à System.Net.Http.Formatting.dll, mais cela appartient en réalité à une version plus ancienne. J'ai rencontré des problèmes avec cela sur notre serveur de build TeamCity, ces deux éléments ne coopéraient pas ensemble.

Alternativement, vous pouvez remplacer PostAsJsonAsync par un appel à PostAsync, qui fait partie du nouveau fichier dll. Remplacez

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

Par :

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

Notez que JavaScriptSerializer se trouve dans l'espace de noms : System.Web.Script.Serialization.

Vous devrez ajouter une référence d'assemblage dans votre fichier csproj : System.Web.Extensions.dll

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

171voto

Todd H. Points 526

La référence manquante est le System.Net.Http.Formatting.dll. Mais la meilleure solution est d'ajouter le package NuGet Microsoft.AspNet.WebApi.Client pour garantir que la version du dll de formatage fonctionne avec la version du framework .NET de System.Net.Http dans mon projet.

41voto

Comme déjà débattu, cette méthode n'est plus disponible depuis .NET 4.5.2. Pour approfondir la réponse de Jeroen K, vous pouvez créer une méthode d'extension :

public static async Task PostAsJsonAsync(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);
}

Maintenant, vous pouvez appeler client.PostAsJsonAsync("api/AgentCollection", user).

13voto

Mr Giggles Points 370

J'ai également rencontré ce problème sur un projet que je venais de récupérer depuis le contrôle de source.

Le symptôme était l'erreur décrite ci-dessus et un triangle d'avertissement jaune sur une référence à System.Net.Http.Formatting

Pour résoudre cela, j'ai supprimé la référence cassée, puis j'ai utilisé NuGet pour installer la dernière version de Microsoft.AspNet.WebApi.Client.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X