HttpClient ไม่รองรับวิธี PostAsJsonAsync C #


255

ฉันพยายามโทรหาเว็บ API จากเว็บแอปพลิเคชันของฉัน ฉันใช้. Net 4.5 และในขณะที่เขียนรหัสที่ฉันได้รับข้อผิดพลาดHttpClientไม่มีPostAsJsonAsyncวิธีการกำหนด

ด้านล่างเป็นรหัส:

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;

และฉันได้รับข้อความแสดงข้อผิดพลาด:

ข้อผิดพลาด: 'System.Net.Http.HttpClient' ไม่มีคำจำกัดความสำหรับ 'PostAsJsonAsync' และไม่มีวิธีการขยาย 'PostAsJsonAsync' ที่ยอมรับอาร์กิวเมนต์ชนิดแรก 'System.Net.Http.HttpClient' ใช้คำสั่งหรือการอ้างอิงประกอบ?)

โปรดดูและให้คำแนะนำกับฉัน


13
ตัวเลือกที่ดีที่สุดคือการเพิ่ม 'Microsoft.AspNet.WebApi.Client'. แพ็คเกจแพคเกจ แค่นั้นแหละ!
Sachin Pawar

คำตอบ:


435

ใช่คุณต้องเพิ่มการอ้างอิงถึง

System.Net.Http.Formatting.dll

สามารถพบได้ในพื้นที่แอสเซมบลีส่วนขยาย

วิธีที่ดีในการบรรลุเป้าหมายนี้คือการเพิ่มแพ็คเกจ NuGetMicrosoft.AspNet.WebApi.Clientให้กับโครงการของคุณ


7
ตอนนี้ฉันได้รับข้อผิดพลาด: "ไม่สามารถโหลดไฟล์หรือชุดประกอบ 'Newtonsoft.Json, รุ่น = 4.5.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 30ad4fe6b2a6aeed' หรือการพึ่งพาอย่างใดอย่างหนึ่งระบบไม่พบไฟล์ที่ระบุ"
Jidheesh Rajan

89
พบฉันต้องเพิ่มแพคเกจ NuGet "Microsoft.AspNet.WebApi.Client" เพื่อให้แน่ใจว่าเวอร์ชันของการจัดรูปแบบ dll ทำงานร่วมกับ. NET Framework รุ่น "System.Net.Http" ในโครงการของฉัน
ทอดด์เอช.

27
ทำไมการอ้างอิงแอสเซมบลีระบบมาตรฐานทำให้ฉันต้องดาวน์โหลดข้อมูลโอเพ่นซอร์สจากตำแหน่งสุ่มบนอินเทอร์เน็ตเพื่อให้สามารถใช้งานได้ ทำไมสิ่งนี้ถึงคอมไพล์ได้ถ้ามันไม่สามารถแก้ปัญหาการพึ่งพาได้ สิ่งนี้ทำให้ฉันไม่จบ!
Neutrino

4
@Neutrino คุณต้องการเขียนรหัสด้วยตัวเองหรือไม่? คุณควรจะขอบคุณที่ folks ที่ไมโครซอฟท์และที่อื่น ๆ ที่มีการเขียนรหัสคุณสามารถใช้งานได้ฟรี
reggaeguitar

4
PM> การติดตั้งแพ็กเกจ System.Net.Http.Formatting.Extension
Yar

193

PostAsJsonAsyncไม่อยู่ในSystem.Net.Http.dll(. NET 4.5.2) อีกต่อไป คุณสามารถเพิ่มการอ้างอิงถึงSystem.Net.Http.Formatting.dllได้ แต่นี่เป็นของรุ่นเก่ากว่าจริงๆ ฉันพบปัญหาในการสร้างเซิร์ฟเวอร์ TeamCity ของเราสองสิ่งนี้จะไม่ทำงานร่วมกัน

หรือคุณสามารถแทนที่PostAsJsonAsyncด้วยการPostAsyncโทรซึ่งเป็นเพียงส่วนหนึ่งของ dll ใหม่ แทนที่

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

ด้วย:

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

โปรดทราบว่าJavaScriptSerializerอยู่ใน namespace System.Web.Script.Serializationนี้:

คุณจะต้องเพิ่มการอ้างอิงการชุมนุมใน csproj ของคุณ: System.Web.Extensions.dll

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


7
นี่ควรเป็นคำตอบ วิธีที่ดีที่สุดในการทำบางสิ่งเป็นวิธีที่ถูกต้อง
Alireza

4
นี่คือคำตอบที่ดีที่สุด อย่าลองเพิ่มแพคเกจ NuGet หรือที่กำลัง
Gökhan Kurt

3
คำตอบที่ดีที่สุดโดยสิ้นเชิง คำตอบที่เลือกไม่ใช่วิธีปฏิบัติที่ดีที่สุดเลยอันที่จริง Microsoft แนะนำไม่ให้อ้างอิง DLLs
Astaar

4
ปิดหัวข้อ แต่ฉันต้องการที่จะพูดถึงมัน anyways: ใช้แทนawait FooAsync() FooAsync().Resultคนหลังสามารถหยุดชะงักได้ ดูstackoverflow.com/q/17248680/2272514และคำตอบที่ยอมรับได้ นอกจากนี้ยังมีลิงก์ที่ดีเกี่ยวกับรายละเอียด
โทมัส Schreiter

2
หากต้องการใช้ประเภทแทน "application / json" คุณสามารถใช้ MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit

163

System.Net.Http.Formatting.dllการอ้างอิงที่ขาดหายไปคือ แต่ทางออกที่ดีกว่าคือการเพิ่มแพ็คเกจ NuGet Microsoft.AspNet.WebApi.Clientเพื่อให้แน่ใจว่ารุ่นของการจัดรูปแบบ dll ทำงานร่วมกับ. NET Framework เวอร์ชั่นSystem.Net.Httpในโครงการของฉัน


1
@Yuval - ฉันรู้แล้วว่า "วิธีแก้ปัญหา" ฉันแนะนำให้ฟังเหมือนความคิดเห็น ปรากฎว่า Andreo เขียนแพ็คเกจ NuGet ที่ฉันแนะนำ
ทอดด์เอช.

นี่คือคำตอบสำหรับฉัน! (สำหรับคำถามของฉัน)
JenonD

34

วิธีนี้จะไม่สามารถใช้ได้อีกต่อไปตั้งแต่. NET 4.5.2 หากต้องการขยายคำตอบของ Jeroen Kคุณสามารถสร้างวิธีการขยายได้:

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

client.PostAsJsonAsync("api/AgentCollection", user)ตอนนี้คุณสามารถที่จะเรียก


12

ฉันมีปัญหานี้เช่นกันในโครงการฉันเพิ่งเช็คเอาต์จากแหล่งควบคุม

อาการเป็นข้อผิดพลาดที่อธิบายไว้ข้างต้นและสามเหลี่ยมเตือนสีเหลืองในการอ้างอิงถึง System.Net.Http.Formatting

เพื่อแก้ไขปัญหานี้ฉันออกอ้างอิงหักและนำไปใช้ในการติดตั้ง NuGet Microsoft.AspNet.WebApi.Clientเวอร์ชันล่าสุด


2
มันได้ผล! ในการติดตั้งโดย Nuget Console ให้ป้อนInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian

4

ฉันรู้ว่าคำตอบนี้สายเกินไปฉันมีปัญหาเดียวกันและฉันเพิ่มSystem.Net.Http.Formatting.ExtensionNuget หลังจากตรวจสอบที่นี่และที่นั่นฉันพบว่ามีการเพิ่ม Nuget แต่System.Net.Http.Formatting.dllไม่ได้เพิ่มไปยังการอ้างอิงฉันเพิ่งติดตั้ง Nuget ใหม่



2

แทนที่จะเขียนโค้ดจำนวนนี้เพื่อโทรออกอย่างง่ายคุณสามารถใช้โปรแกรมเสริมห่อหุ้มทางอินเทอร์เน็ตได้

ฉันได้เขียนหนึ่งชื่อ WebApiClient ที่ NuGet ... ลองดูสิ!

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


@Andreoลิงก์ ( webapiclient.azurewebsites.net ) ตอนนี้เสียเมื่อวันที่ 30 พ.ย. 2017 ลิงก์การทำงานของ NuGet คือnuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G

น่าเสียดายที่ Microsoft ได้จบการสมัครสมาชิก Azure ของฉันและ URL ไม่ถูกต้องอีกต่อไป :(
Andreo Romera

2

หากคุณกำลังเล่นรอบใน Blazor Microsoft.AspNetCore.Blazor.HttpClientและได้รับข้อผิดพลาดคุณต้องเพิ่มแพคเกจ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.