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

255

J'essaie d'appeler une API Web à partir de mon application Web. J'utilise .Net 4.5 et lors de l'écriture du code, j'obtiens l'erreur HttpClientne contient pas de PostAsJsonAsyncméthode de définition .

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' a pu être trouvée (vous manque-t-il un en utilisant une directive ou une référence d'assembly?)

Veuillez me consulter et me conseiller.

Jidheesh Rajan
la source
14
La meilleure option consiste à ajouter le package "Microsoft.AspNet.WebApi.Client" .Nuget. C'est tout!
Sachin Pawar

Réponses:

435

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

System.Net.Http.Formatting.dll

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

Un bon moyen d'y parvenir est d'ajouter le package NuGetMicrosoft.AspNet.WebApi.Client à votre projet.

Justin Harvey
la source
7
Maintenant, je reçois une erreur: "Impossible de charger le fichier ou l'assembly 'Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié."
Jidheesh Rajan
89
J'ai trouvé que je devais ajouter le package NuGet "Microsoft.AspNet.WebApi.Client" pour m'assurer que la version de la DLL de formatage fonctionnait avec la version du framework .NET de "System.Net.Http" dans mon projet.
Todd H.
27
Pourquoi le référencement d'un assemblage de système standard nécessite-t-il que je télécharge des éléments open source à partir d'emplacements aléatoires sur Internet pour le faire fonctionner? Pourquoi cela compile-t-il même s'il ne peut pas résoudre ses dépendances? Cela me contrarie sans fin!
Neutrino
4
@Neutrino Préférez-vous écrire le code vous-même? Vous devriez être reconnaissant que les gens de Microsoft et d'ailleurs aient écrit du code que vous pouvez utiliser gratuitement
reggaeguitar
4
PM> Install-Package System.Net.Http.Formatting.Extension
Yar
194

PostAsJsonAsyncn'est plus dans 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 ancienne version. J'ai rencontré des problèmes avec cela sur notre serveur de build TeamCity, ces deux ne coopéreraient pas ensemble.

Alternativement, vous pouvez remplacer PostAsJsonAsyncpar un PostAsyncappel, qui n'est qu'une 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 JavaScriptSerializerest dans l'espace de noms: System.Web.Script.Serialization.

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

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

Jeroen K
la source
7
Ce devrait être la réponse. La meilleure façon de faire quelque chose est la bonne façon de procéder
Alireza
4
C'est la meilleure réponse jusqu'à présent. N'essayez pas d'ajouter des packages ou des DLL NuGet.
Gökhan Kurt
3
Totalement la meilleure réponse. Réponse sélectionnée n'est pas une meilleure pratique du tout , en fait Microsoft recommande de ne pas DLLs de référence
Astaar
4
Hors sujet, mais je veux quand même le mentionner: utilisez await FooAsync()au lieu de FooAsync().Result. Ce dernier peut se bloquer. Voir stackoverflow.com/q/17248680/2272514 et sa réponse acceptée. Il existe également de bons liens sur les détails.
Thomas Schreiter
2
Pour utiliser un type au lieu de "application / json", vous pouvez utiliser MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit
164

La référence manquante est le System.Net.Http.Formatting.dll. Mais la meilleure solution consiste à ajouter le package NuGet Microsoft.AspNet.WebApi.Clientpour garantir que la version de la DLL de formatage fonctionne avec la version du framework .NET de System.Net.Httpdans mon projet.

Todd H.
la source
1
@Yuval - Je me rends compte maintenant que la "solution" que j'ai suggérée ressemblait à un commentaire. Il s'avère qu'Andreo est l'auteur du package NuGet que j'ai suggéré.
Todd H.
Ce fut la réponse pour moi! (à ma question)
JenonD
34

Comme déjà débattue, cette méthode n'est plus disponible depuis .NET 4.5.2. Pour développer la 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).

Christian Gollhardt
la source
12

J'ai également eu ce problème sur un projet que je venais de vérifier depuis le contrôle de code 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.

Mr Giggles
la source
2
Ça marche! Pour installer par Nuget Console entrezInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Je sais que cette réponse est trop tard, j'ai eu le même problème et System.Net.Http.Formatting.Extensionj'ajoutais le Nuget, après avoir vérifié ici et là j'ai trouvé que le Nuget était ajouté mais System.Net.Http.Formatting.dlln'a pas été ajouté aux références, je viens de réinstaller le Nuget

Abed Kaff
la source
3

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

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

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

J'en ai écrit un appelé WebApiClient, disponible sur NuGet ... vérifiez-le!

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

Andreo Romera
la source
@Andreo Le lien ( webapiclient.azurewebsites.net ) est maintenant rompu comme au 30 novembre 2017. Le lien de travail NuGet est nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G
Malheureusement, Microsoft a mis fin à mon abonnement azure et l'URL n'est plus valide :(
Andreo Romera
2

Si vous jouez dans Blazor et obtenez l'erreur, vous devez ajouter le package Microsoft.AspNetCore.Blazor.HttpClient.

Briseis
la source
0

En développant simplement la réponse de Jeroen avec les conseils dans les commentaires:

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

var response = await client.PostAsync("api/AgentCollection", content);
Cliquez sur OK
la source