HttpClient không hỗ trợ phương thức PostAsJsonAsync C #


255

Tôi đang cố gắng gọi API web từ ứng dụng web của mình. Tôi đang sử dụng .Net 4.5 và trong khi viết mã, tôi nhận được lỗi HttpClientkhông chứa PostAsJsonAsyncphương thức định nghĩa .

Dưới đây là mã:

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;

và tôi nhận được thông báo lỗi:

Lỗi: 'System.Net.Http.HttpClient' không chứa định nghĩa cho 'PostAsJsonAsync' và Không có phương thức mở rộng 'PostAsJsonAsync' chấp nhận đối số đầu tiên của loại 'System.Net.Http.HttpClient' (bạn đang thiếu một sử dụng chỉ thị hoặc tham chiếu lắp ráp?)

Xin hãy xem và tư vấn cho tôi.


13
Tùy chọn tốt nhất là thêm gói 'Microsoft.AspNet.WebApi.Client' .Nuget. Đó là nó!
Sachin Pawar

Câu trả lời:


435

Có, bạn cần thêm một tham chiếu đến

System.Net.Http.Formatting.dll

Điều này có thể được tìm thấy trong khu vực lắp ráp mở rộng.

Một cách tốt để đạt được điều này là bằng cách thêm gói NuGetMicrosoft.AspNet.WebApi.Client vào dự án của bạn.


7
Bây giờ tôi đang gặp lỗi: "Không thể tải tệp hoặc lắp ráp 'Newtonsoft.Json, Version = 4.5.0.0, Culture = trung tính, PublicKeyToken = 30ad4fe6b2a6aeed' hoặc một trong các phụ thuộc của nó. Hệ thống không thể tìm thấy tệp được chỉ định."
Jidheesh Rajan

89
Tìm thấy tôi đã phải thêm gói NuGet "Microsoft.AspNet.WebApi.Client" để đảm bảo phiên bản định dạng dll hoạt động với phiên bản .NET framework của "System.Net.Http" trong dự án của tôi.
Todd H.

27
Tại sao việc tham chiếu một hệ thống tiêu chuẩn yêu cầu tôi tải xuống các công cụ nguồn mở từ các vị trí ngẫu nhiên trên Internet để làm cho nó hoạt động? Tại sao điều này thậm chí biên dịch nếu nó không thể giải quyết các phụ thuộc của nó? Điều này làm tôi khó chịu!
Neutrino

4
@Neutrino Bạn có muốn tự viết mã không? Bạn nên biết ơn rằng những người ở Microsoft và những nơi khác đã viết mã mà bạn có thể sử dụng miễn phí
reggaeg Ức

4
PM> Cài đặt-Gói System.Net.Http.Formatted.Extension
Yar

193

PostAsJsonAsynckhông còn trong System.Net.Http.dll(.NET 4.5.2). Bạn có thể thêm một tham chiếu đến System.Net.Http.Formatting.dll, nhưng đây thực sự thuộc về một phiên bản cũ hơn. Tôi gặp vấn đề với điều này trên máy chủ xây dựng TeamCity của chúng tôi, hai người này sẽ không hợp tác với nhau.

Ngoài ra, bạn có thể thay thế PostAsJsonAsyncbằng một PostAsynccuộc gọi, đây chỉ là một phần của dll mới. Thay thế

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

Với:

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

Lưu ý rằng JavaScriptSerializertrong không gian tên : System.Web.Script.Serialization.

Bạn sẽ phải thêm một tham chiếu lắp ráp trong csproj của bạn: System.Web.Extensions.dll

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


7
Đây nên là câu trả lời. Cách tốt nhất để làm một cái gì đó là cách chính xác của nó
Alireza

4
Đây là câu trả lời tốt nhất cho đến nay. Đừng thử thêm các gói NuGet hoặc dlls.
Gotkhan Kurt

3
Hoàn toàn là câu trả lời tốt nhất. Câu trả lời được lựa chọn không phải là một thực hành tốt nhất tại tất cả , trên thực tế Microsoft khuyến cáo không để DLL tham khảo
Astaar

4
Tắt chủ đề, nhưng dù sao tôi cũng muốn đề cập đến nó: Sử dụng await FooAsync()thay vì FooAsync().Result. Người sau có thể bế tắc. Xem stackoverflow.com/q/17248680/2272514 và câu trả lời được chấp nhận của nó. Ngoài ra còn có các liên kết tốt về chi tiết.
Thomas Schreiter

2
Để sử dụng loại thay vì "application / json", bạn có thể sử dụng MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/iêu
daviesdoesit

163

Các tài liệu tham khảo còn thiếu là System.Net.Http.Formatting.dll. Nhưng giải pháp tốt hơn là thêm gói NuGet Microsoft.AspNet.WebApi.Clientđể đảm bảo phiên bản định dạng dll hoạt động với phiên bản .NET framework System.Net.Httptrong dự án của tôi.


1
@Yuval - Bây giờ tôi nhận ra rằng "giải pháp" mà tôi đề xuất nghe có vẻ giống như một bình luận. Hóa ra Andreo là tác giả của gói NuGet mà tôi đề xuất.
Todd H.

Đây là câu trả lời cho tôi! (với câu hỏi của tôi)
JenonD

34

Như đã được gỡ lỗi, phương thức này không còn khả dụng nữa kể từ .NET 4.5.2. Để mở rộng câu trả lời của Jeroen K, bạn có thể tạo một phương thức mở rộng:

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

Bây giờ bạn có thể gọi client.PostAsJsonAsync("api/AgentCollection", user).


12

Tôi cũng gặp vấn đề này trong một dự án mà tôi vừa kiểm tra từ kiểm soát nguồn.

Triệu chứng là lỗi được mô tả ở trên và hình tam giác cảnh báo màu vàng trên tham chiếu đến System.Net.Http.Formatting

Để khắc phục điều này, tôi đã xóa tham chiếu bị hỏng và sau đó sử dụng NuGet để cài đặt phiên bản mới nhất Microsoft.AspNet.WebApi.Client.


2
Nó hoạt động! Để cài đặt bằng Bảng điều khiển Nuget, hãy nhậpInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian

4

Tôi biết câu trả lời này là quá muộn, tôi đã gặp vấn đề tương tự và tôi đã thêm System.Net.Http.Formatting.ExtensionNuget, sau khi kiểm tra ở đây và tôi thấy rằng Nuget đã được thêm nhưng System.Net.Http.Formatting.dllkhông được thêm vào tài liệu tham khảo, tôi chỉ cần cài đặt lại Nuget


3

Hãy thử cài đặt trong dự án của bạn Gói NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client

2

Thay vì viết số lượng mã này để thực hiện một cuộc gọi đơn giản, bạn có thể sử dụng một trong các trình bao bọc có sẵn qua internet.

Tôi đã viết một cái tên là WebApiClient, có sẵn tại NuGet ... hãy xem thử!

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


@Andreo Liên kết ( webapiclient.azurewebsites.net ) hiện đã bị hỏng kể từ ngày 30 tháng 11 năm 2017. Liên kết làm việc của NuGet là nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G

Thật không may, Microsoft đã kết thúc đăng ký azure của tôi và url không còn hợp lệ :(
Andreo Romera

2

Nếu bạn đang chơi xung quanh trong Blazor và gặp lỗi, bạn cần thêm gói Microsoft.AspNetCore.Blazor.HttpClient.


0

Chỉ cần mở rộng câu trả lời của Jeroen với các mẹo trong nhận xét:

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

var response = await client.PostAsync("api/AgentCollection", content);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.