HttpClient PostAsJsonAsync yöntemini desteklemiyor C #


255

Web uygulamamdan bir web API'sini çağırmaya çalışıyorum. Net 4.5 kullanıyorum ve kodu yazarken hata alıyorum HttpClientbir tanım PostAsJsonAsyncyöntemi içermiyor .

Kod aşağıdadır:

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;

ve hata mesajını alıyorum:

Hata: 'System.Net.Http.HttpClient', 'PostAsJsonAsync' için bir tanım içermiyor ve 'System.Net.Http.HttpClient' türünün ilk bağımsız değişkenini kabul eden 'PostAsJsonAsync' için bir uzantı yöntemi yok (eksik mi? direktif mi yoksa montaj referansı mı kullanıyorsunuz?)

Lütfen bir göz atın ve bana tavsiyelerde bulunun.


14
En iyi seçenek 'Microsoft.AspNet.WebApi.Client' .Nuget paketini eklemektir. Bu kadar!
Sachin Pawar

Yanıtlar:


435

Evet, bir referans eklemeniz gerekiyor

System.Net.Http.Formatting.dll

Bu, uzantı montajları alanında bulunabilir.

Bunu başarmanın iyi bir yolu projenize NuGet paketiniMicrosoft.AspNet.WebApi.Client eklemektir .


7
Şimdi bir hata alıyorum: "Dosya veya derleme yüklenemedi 'Newtonsoft.Json, Sürüm = 4.5.0.0, Kültür = nötr, PublicKeyToken = 30ad4fe6b2a6aeed' veya bağımlılıkları biri. Sistem belirtilen dosyayı bulamıyor."
Jidheesh Rajan

89
Bulundu Projemde "System.Net.Http" .NET çerçeve sürümü ile çalıştı biçimlendirme dll sürümü sağlamak için "Microsoft.AspNet.WebApi.Client" NuGet paketi eklemek zorunda kaldı.
Todd

27
Standart bir sistem montajına başvurmak neden çalışabilmesi için İnternet'teki rastgele konumlardan açık kaynaklı şeyler indirmemi gerektiriyor? Bağımlılığını çözemezse neden derleniyor? Bu beni hiç bitirmez!
Neutrino

4
@Neutrino Kodu kendiniz mi yazmayı tercih edersiniz? Microsoft ve başka yerlerdeki
kişilerin

4
PM> Kurulum Paketi System.Net.Http.Formatting.Extension
Yar

194

PostAsJsonAsyncartık System.Net.Http.dll(.NET 4.5.2) içinde değil. Bir referans ekleyebilirsiniz System.Net.Http.Formatting.dll, ancak bu aslında eski bir sürüme aittir. TeamCity derleme sunucumuzda bu sorunla karşılaştım, bu ikisi birlikte çalışmaz.

Alternatif olarak, sadece yeni dll'nin bir parçası olan PostAsJsonAsyncbir PostAsyncçağrı ile değiştirebilirsiniz . değiştirmek

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

İle:

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

Not JavaScriptSerializerad alanında geçerli: System.Web.Script.Serialization.

Csproj'nuza bir montaj referansı eklemeniz gerekecektir: System.Web.Extensions.dll

Bkz. Https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836


7
Cevap bu olmalı. Bir şey yapmanın en iyi yolu bunun doğru yoludur
Alireza

4
Bu şimdiye kadarki en iyi cevap. NuGet paketleri veya dll'leri eklemeyi denemeyin.
Gökhan Kurt

3
Tamamen en iyi cevap. Seçilmiş cevabı en iyi yöntem değil hiç Microsoft referans DLL'lere değil önerir aslında,
Astaar

4
Konu dışı, ama yine de bahsetmek istiyorum: await FooAsync()yerine kullanın FooAsync().Result. İkincisi kilitlenebilir. Bkz. Stackoverflow.com/q/17248680/2272514 ve kabul edilen cevabı. Ayrıca ayrıntılarla ilgili iyi bağlantılar da vardır.
Thomas Schreiter

2
"Application / json" yerine bir tür kullanmak için MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit

164

Eksik başvuru System.Net.Http.Formatting.dll. Ama daha iyi bir çözüm, projemde Microsoft.AspNet.WebApi.Client.NET framework sürümü ile çalıştı biçimlendirme dll sürümü sağlamak için NuGet paketi eklemektir System.Net.Http.


1
@Yuval - Şimdi anladığım "çözümün" bir yorum gibi geldiğini anlıyorum. Andreo'nun önerdiğim NuGet paketini yazdığı ortaya çıktı.
Todd H.

Bu benim cevabımdı! (soruma)
JenonD

34

Daha önce tartışıldığı gibi, .NET 4.5.2'den beri bu yöntem artık kullanılamamaktadır. Jeroen K'nin cevabını genişletmek için bir uzatma yöntemi yapabilirsiniz:

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

Artık arayabiliyorsunuz client.PostAsJsonAsync("api/AgentCollection", user).


12

Bu sorunu kaynak kontrolünden yeni kontrol ettiğim bir projede de yaşadım.

Belirti yukarıda açıklanan hata ve referans olarak sarı bir uyarı üçgeni System.Net.Http.Formatting

Bunu düzeltmek için kırık başvuruyu kaldırdım ve sonra NuGet'i kullanarak en son sürümünü yükledim Microsoft.AspNet.WebApi.Client.


2
İşe yarıyor! Nuget Console tarafından kurmak için girinInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian

4

Bu yanıtı çok geç biliyorum, ben aynı sorunu vardı ve ben System.Net.Http.Formatting.Extensionburada kontrol ettikten sonra Nuget ekliyordu ve orada Nuget eklendi ama System.Net.Http.Formatting.dllreferanslara eklenmedi bulundu, ben sadece Nuget yeniden yüklendi



2

Basit bir arama yapmak için bu miktarda kod yazmak yerine, internet üzerinden kullanılabilen sarmalayıcılardan birini kullanabilirsiniz.

NuGet'te bulunan WebApiClient adında bir tane yazdım ... bir göz atın!

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


@Andreo Bağlantı ( webapiclient.azurewebsites.net ) 30 Kasım 2017'de olduğu gibi kesildi. NuGet
Vishwajit G

Ne yazık ki Microsoft masmavi aboneliğimi sonlandırdı ve url artık geçerli değil :(
Andreo Romera

2

Blazor'da oynuyorsanız ve hatayı alıyorsanız, paketi eklemeniz gerekir Microsoft.AspNetCore.Blazor.HttpClient.


0

Jeroen'in cevabını yorumlardaki ipuçlarıyla genişletmek :

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

var response = await client.PostAsync("api/AgentCollection", content);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.