web-dev-qa-db-fra.com

HttpClient ne prenant pas en charge la méthode PostAsJsonAsync C #

J'essaie d'appeler une API Web à partir de mon application Web. J'utilise .Net 4.5 et lors de l'écriture du code, l'erreur HttpClient ne contient pas de méthode de définition PostAsJsonAsync.

Ci-dessous 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' n'accepte un premier argument de type 'System.Net.Http.HttpClient' (vous manque-t-il un utilisant une directive ou une référence d'assemblée?)

S'il vous plaît jeter un oeil et me conseiller.

212
Jidheesh Rajan

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

System.Net.Http.Formatting.dll

Cela se trouve dans la zone des assemblées d'extensions.

Un bon moyen d'y parvenir consiste à ajouter le package NuGet Microsoft.AspNet.WebApi.Client à votre projet.

367
Justin Harvey

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

Vous pouvez également remplacer PostAsJsonAsync par un appel PostAsync, qui fait simplement partie de la nouvelle dll. Remplacer

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

Avec:

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 nom: System.Web.Script.Serialization.

Vous devrez ajouter une référence Assembly dans votre csproj: System.Web.Extensions.dll

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

160
Jeroen K

La référence manquante est le _System.Net.Http.Formatting.dll_. Mais la meilleure solution consiste à ajouter le package NuGet _Microsoft.AspNet.WebApi.Client_ pour s’assurer que la version de la DLL de mise en forme fonctionne avec la version du framework .NET _System.Net.Http_ dans mon projet.

156
Todd H.

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

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

Vous pouvez maintenant appeler client.PostAsJsonAsync("api/AgentCollection", user).

31

J'ai également eu ce problème sur un projet que je venais d'extraire du 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 ce problème, j'ai supprimé la référence cassée, puis utilisé NuGet pour installer la dernière version de Microsoft.AspNet.WebApi.Client.

10
Mr Giggles

Je sais que cette réponse est trop tardive. J'avais le même problème et j'ajoutais le System.Net.Http.Formatting.Extension Nuget. Après vérification, j'ai constaté que le Nuget était ajouté mais le System.Net.Http.Formatting.dll n'était pas ajouté aux références. , Je viens de réinstaller le Nuget

3
Abed Kaff

Au lieu d'écrire cette quantité de code pour effectuer un simple appel, vous pouvez utiliser l'un des wrappers disponibles sur Internet.

J'en ai écrit un appelé WebApiClient, disponible chez NuGet ... jetez-y un coup d'œil!

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

1
Andreo Romera

Essayez d’installer dans votre projet le package NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client