HttpClient non supporta il metodo PostAsJsonAsync C #


255

Sto provando a chiamare un'API Web dalla mia applicazione Web. Sto usando .Net 4.5 e mentre scrivo il codice sto ottenendo l'errore HttpClientnon contiene un PostAsJsonAsyncmetodo di definizione .

Di seguito è riportato il codice:

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;

e sto ricevendo il messaggio di errore:

Errore: 'System.Net.Http.HttpClient' non contiene una definizione per 'PostAsJsonAsync' e non è stato possibile trovare un metodo di estensione 'PostAsJsonAsync' che accetta un primo argomento di tipo 'System.Net.Http.HttpClient' (ti manca un usando la direttiva o un riferimento di assembly?)

Per favore, dai un'occhiata e consigli.


14
L'opzione migliore è aggiungere il pacchetto "Microsoft.AspNet.WebApi.Client" .Nuget. Questo è tutto!
Sachin Pawar,

Risposte:


435

Sì, è necessario aggiungere un riferimento a

System.Net.Http.Formatting.dll

Questo può essere trovato nell'area degli assiemi di estensioni.

Un buon modo per raggiungere questo obiettivo è l'aggiunta del pacchetto NuGetMicrosoft.AspNet.WebApi.Client al progetto.


7
Ora sto ricevendo un errore: "Impossibile caricare il file o l'assembly 'Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato."
Jidheesh Rajan,

89
Ho scoperto che dovevo aggiungere il pacchetto NuGet "Microsoft.AspNet.WebApi.Client" per assicurarmi che la versione della dll di formattazione funzionasse con la versione .NET di "System.Net.Http" nel mio progetto.
Todd H.

27
Perché fare riferimento a un assembly di sistema standard mi richiede di scaricare elementi open source da posizioni casuali su Internet per farlo funzionare? Perché questo si compila anche se non riesce a risolvere le sue dipendenze? Questo mi irrita a non finire!
Neutrino,

4
@Neutrino Preferiresti scrivere tu stesso il codice? Dovresti essere grato che le persone di Microsoft e altrove abbiano un codice scritto che puoi usare gratuitamente
reggaeguitar

4
PM> Install-Package System.Net.Http.Formatting.Extension
Yar

194

PostAsJsonAsyncnon è più in System.Net.Http.dll(.NET 4.5.2). È possibile aggiungere un riferimento a System.Net.Http.Formatting.dll, ma questo in realtà appartiene a una versione precedente. Ho riscontrato problemi con questo sul nostro server di build TeamCity, questi due non collaborerebbero insieme.

In alternativa, è possibile sostituire PostAsJsonAsynccon una PostAsyncchiamata, che è solo una parte della nuova dll. Sostituire

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;

Si noti che JavaScriptSerializerè nello spazio dei nomi: System.Web.Script.Serialization.

Dovrai aggiungere un riferimento all'assembly nel tuo csproj: System.Web.Extensions.dll

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


7
Questa dovrebbe essere la risposta. Il modo migliore per fare qualcosa è il modo corretto di farlo
Alireza,

4
Questa è la risposta migliore finora. Non provare ad aggiungere pacchetti o DLL NuGet.
Gökhan Kurt,

3
Totalmente la risposta migliore. Risposta selezionato non è una pratica migliore a tutti , in realtà Microsoft non raccomanda di DLL di riferimento
Astaar

4
Fuori tema, ma voglio menzionarlo comunque: utilizzare await FooAsync()invece di FooAsync().Result. Quest'ultimo può deadlock. Vedi stackoverflow.com/q/17248680/2272514 e la sua risposta accettata. Ci sono anche buoni collegamenti sui dettagli.
Thomas Schreiter,

2
Per utilizzare un tipo anziché "application / json" è possibile utilizzare MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit

164

Il riferimento mancante è il System.Net.Http.Formatting.dll. Ma la soluzione migliore è quella di aggiungere il pacchetto NuGet Microsoft.AspNet.WebApi.Clientper garantire che la versione della formattazione dll abbia funzionato con la versione di .NET framework System.Net.Httpnel mio progetto.


1
@Yuval - Adesso mi rendo conto che la "soluzione" che ho suggerito sembrava un commento. Si scopre che Andreo ha creato il pacchetto NuGet che ho suggerito.
Todd H.

Questa è stata la risposta per me! (alla mia domanda)
JenonD

34

Come già debuttato, questo metodo non è più disponibile da .NET 4.5.2. Per espandere la risposta di Jeroen K puoi creare un metodo di estensione:

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

Adesso puoi chiamare client.PostAsJsonAsync("api/AgentCollection", user).


12

Ho avuto questo problema anche su un progetto che avevo appena estratto dal controllo del codice sorgente.

Il sintomo era l'errore sopra descritto e un triangolo giallo su un riferimento a System.Net.Http.Formatting

Per risolvere questo problema, ho rimosso il riferimento non funzionante e quindi ho utilizzato NuGet per installare l'ultima versione di Microsoft.AspNet.WebApi.Client.


2
Funziona! Per l'installazione da Nuget Console, inserisciInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian,

4

So che questa risposta è troppo tardi, ho avuto lo stesso problema e stavo aggiungendo il System.Net.Http.Formatting.ExtensionNuget, dopo aver controllato qua e là ho scoperto che il Nuget è stato aggiunto ma System.Net.Http.Formatting.dllnon è stato aggiunto ai riferimenti, ho appena reinstallato il Nuget


3

Prova a installare nel tuo progetto il pacchetto NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client

2

Invece di scrivere questa quantità di codice per effettuare una semplice chiamata, è possibile utilizzare uno degli involucri disponibili su Internet.

Ne ho scritto uno chiamato WebApiClient, disponibile su NuGet ... dai un'occhiata!

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


@Andreo Il collegamento ( webapiclient.azurewebsite.net ) è ora interrotto come il 30-nov-2017. Il link di lavoro di NuGet è nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G

Purtroppo Microsoft ha terminato il mio abbonamento azzurrato e l'URL non è più valido :(
Andreo Romera

2

Se stai giocando in Blazor e ricevi l'errore, devi aggiungere il pacchetto Microsoft.AspNetCore.Blazor.HttpClient.


0

Basta espandere la risposta di Jeroen con i suggerimenti nei commenti:

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

var response = await client.PostAsync("api/AgentCollection", content);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.