HttpClient tidak mendukung metode PostAsJsonAsync C #

255

Saya mencoba memanggil API web dari aplikasi web saya. Saya menggunakan .Net 4.5 dan saat menulis kode saya mendapatkan kesalahan HttpClienttidak mengandung PostAsJsonAsyncmetode definisi .

Di bawah ini adalah kode:

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;

dan saya mendapatkan pesan kesalahan:

Kesalahan: 'System.Net.Http.HttpClient' tidak mengandung definisi untuk 'PostAsJsonAsync' dan Tidak Ada metode ekstensi 'PostAsJsonAsync' menerima argumen pertama dari jenis 'System.Net.Http.HttpClient' dapat ditemukan (apakah Anda melewatkan sebuah menggunakan arahan atau referensi perakitan?)

Silakan lihat dan saran saya.

Jidheesh Rajan
sumber
13
Opsi terbaik adalah menambahkan '. Paket nuget Microsoft.AspNet.WebApi.Client'. Itu dia!
Sachin Pawar

Jawaban:

435

Ya, Anda perlu menambahkan referensi

System.Net.Http.Formatting.dll

Ini dapat ditemukan di area majelis ekstensi.

Cara yang baik untuk mencapai ini adalah dengan menambahkan paket NuGetMicrosoft.AspNet.WebApi.Client ke proyek Anda.

Justin Harvey
sumber
7
Sekarang saya mendapatkan kesalahan: "Tidak dapat memuat file atau rakitan 'Newtonsoft.Json, Versi = 4.5.0.0, Budaya = netral, PublicKeyToken = 30ad4fe6b2a6aeed' atau salah satu dari ketergantungannya. Sistem tidak dapat menemukan file yang ditentukan."
Jidheesh Rajan
89
Ditemukan saya harus menambahkan paket NuGet "Microsoft.AspNet.WebApi.Client" untuk memastikan versi dll pemformatan bekerja dengan versi .NET framework "System.Net.Http" di proyek saya.
Todd H.
27
Mengapa merujuk pada rakitan sistem standar mengharuskan saya mengunduh hal-hal sumber terbuka dari lokasi acak di Internet untuk membuatnya berfungsi? Mengapa ini bahkan dikompilasi jika tidak dapat menyelesaikan dependensinya? Ini mengganggu saya tanpa akhir!
Neutrino
4
@Neutrino Anda lebih suka menulis kode sendiri? Anda harus bersyukur bahwa orang-orang di Microsoft dan di tempat lain telah menulis kode yang dapat Anda gunakan secara gratis
reggaeguitar
4
PM> Instal-Paket System.Net.Http.Formatting.Extension
Yar
194

PostAsJsonAsynctidak lagi di System.Net.Http.dll(.NET 4.5.2). Anda dapat menambahkan referensi System.Net.Http.Formatting.dll, tetapi ini sebenarnya milik versi yang lebih lama. Saya mengalami masalah dengan ini di server build TeamCity kami, keduanya tidak mau bekerja sama.

Atau, Anda dapat mengganti PostAsJsonAsyncdengan PostAsyncpanggilan, yang hanya merupakan bagian dari dll baru. Menggantikan

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

Dengan:

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

Perhatikan bahwa JavaScriptSerializerdalam namespace: System.Web.Script.Serialization.

Anda harus menambahkan referensi perakitan di csproj Anda: System.Web.Extensions.dll

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

Jeroen K
sumber
7
Ini seharusnya jawabannya. Cara terbaik untuk melakukan sesuatu adalah cara yang benar
Alireza
4
Ini adalah jawaban terbaik sejauh ini. Jangan mencoba menambahkan paket NuGet atau dll.
Gökhan Kurt
3
Benar-benar jawaban terbaik. Jawaban yang dipilih bukanlah praktik terbaik sama sekali , bahkan Microsoft merekomendasikan untuk tidak merujuk DLL
Astaar
4
Di luar topik, tetapi saya ingin menyebutkannya: Gunakan await FooAsync()alih-alih FooAsync().Result. Yang terakhir bisa menemui jalan buntu. Lihat stackoverflow.com/q/17248680/2272514 dan jawabannya diterima. Ada juga tautan bagus tentang detail.
Thomas Schreiter
2
Untuk menggunakan jenis bukan "aplikasi / json" Anda bisa menggunakan MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/...
daviesdoesit
164

Referensi yang hilang adalah System.Net.Http.Formatting.dll. Tetapi solusi yang lebih baik adalah dengan menambahkan paket NuGet Microsoft.AspNet.WebApi.Clientuntuk memastikan versi dll pemformatan bekerja dengan versi .NET framework System.Net.Httpdalam proyek saya.

Todd H.
sumber
1
@ Yuval - Saya menyadari sekarang bahwa "solusi" yang saya sarankan terdengar seperti komentar. Ternyata Andreo menulis paket NuGet yang saya sarankan.
Todd H.
Inilah jawaban untuk saya! (untuk pertanyaan saya)
JenonD
34

Seperti yang sudah didebat, metode ini tidak tersedia lagi sejak .NET 4.5.2. Untuk memperluas jawaban Jeroen K, Anda dapat membuat metode ekstensi:

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

Sekarang Anda dapat menelepon client.PostAsJsonAsync("api/AgentCollection", user).

Christian Gollhardt
sumber
12

Saya punya masalah ini juga pada proyek saya baru saja memeriksa dari kontrol sumber.

Gejala adalah kesalahan yang dijelaskan di atas dan segitiga peringatan kuning pada referensi ke System.Net.Http.Formatting

Untuk memperbaikinya, saya menghapus referensi yang rusak dan kemudian menggunakan NuGet untuk menginstal versi terbaru Microsoft.AspNet.WebApi.Client.

Tuan Giggles
sumber
2
Berhasil! Untuk menginstal oleh Nuget Console masukkanInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Saya tahu balasan ini terlambat, saya memiliki masalah yang sama dan saya menambahkan System.Net.Http.Formatting.ExtensionNuget, setelah memeriksa di sana-sini saya menemukan bahwa Nuget ditambahkan tetapi System.Net.Http.Formatting.dlltidak ditambahkan ke referensi, saya baru menginstal ulang Nuget

Abed Kaff
sumber
3

Cobalah untuk menginstal dalam proyek Anda Paket NuGet: Microsoft.AspNet.WebApi.Client:

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

Alih-alih menulis jumlah kode ini untuk membuat panggilan sederhana, Anda dapat menggunakan salah satu pembungkus yang tersedia melalui internet.

Saya telah menulis satu yang disebut WebApiClient, tersedia di NuGet ... coba lihat!

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

Andreo Romera
sumber
@Andreo Tautan ( webapiclient.azurewebsites.net ) sekarang rusak pada 30-Nov-2017. Tautan kerja NuGet adalah nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G
Sayangnya Microsoft telah mengakhiri langganan biru saya dan url tidak lagi valid :(
Andreo Romera
2

Jika Anda bermain-main di Blazor dan mendapatkan kesalahan, Anda perlu menambahkan paket Microsoft.AspNetCore.Blazor.HttpClient.

Briseis
sumber
0

Hanya perluas jawaban Jeroen dengan kiat di komentar:

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

var response = await client.PostAsync("api/AgentCollection", content);
Klik Oke
sumber