HTTPContent.ReadAsAsync ở đâu?


283

Tôi thấy hàng tấn ví dụ trên web sử dụng HttpClientđối tượng mới (như một phần của API Web mới) cần có HttpContent.ReadAsAsync<T>phương thức. Tuy nhiên, MSDN không đề cập đến phương pháp này và IntelliSense cũng không tìm thấy nó.

Nó đã đi đâu và làm thế nào để tôi làm việc xung quanh nó?

Câu trả lời:


436

Có vẻ như đây là một phương thức mở rộng (trong System.Net.Http.Formatted):

Lớp httpContentExtensions

Cập nhật:

PM> gói cài đặt Microsoft.AspNet.WebApi.Client

Theo trang gói System.Net.Http.Formatted NuGet, System.Net.Http.Formattinggói này hiện là di sản và thay vào đó có thể tìm thấy trong Microsoft.AspNet.WebApi.Clientgói có sẵn trên NuGet tại đây .


Điều này đã bị phản đối trong Nugets khách hàng mới nhất? Không thể tìm thấy nó bây giờ (được sử dụng để có thể).
georgiosd

Nó cũng có thể được. .NET4.5 đã thêm rất nhiều công cụ mới liên quan đến async / task (đang chờ, v.v.), vì vậy những tiện ích mở rộng này có thể không còn cần thiết nữa. Tôi có thể có một cái nhìn ở đây, ví dụ: msdn.microsoft.com/en-us/l Library / Wiêu
J ...

4
@georgiosd Tôi vừa cập nhật câu trả lời. Trong khi đó, có System.Net.Http.Formattingvẻ như nó đã được chuyển sang gói nuget.org/packages/Microsoft.AspNet.WebApi.Client .
Joseph Woodward

1
Vì vậy, có đúng là phương thức trong câu hỏi ban đầu HttpContent.ReadAsAsync<T>không nằm trong Microsoft.AspNet.WebApi.Client? Đề nghị thay thế là gì?
Patrick Szalapski

1
@JedatKinports Khá chắc chắn là không. Gói WebAPI.Client yêu cầu .NET 4.5. Tôi nghĩ rằng HTTPContentExtensions cũ là dành cho .NET 4.0
J ...

68

Tôi có cùng một vấn đề, vì vậy tôi chỉ cần lấy chuỗi JSON và giải tuần tự hóa cho lớp của mình:

HttpResponseMessage response = await client.GetAsync("Products");
//get data as Json string 
string data = await response.Content.ReadAsStringAsync();
//use JavaScriptSerializer from System.Web.Script.Serialization
JavaScriptSerializer JSserializer = new JavaScriptSerializer();
//deserialize to your class
products = JSserializer.Deserialize<List<Product>>(data);

8
Bên cạnh thực tế là điều này không trả lời câu hỏi, tại sao điều này lại bị bỏ phiếu? Nó không phải là một thay thế hợp lý để ReadAsAsync?
Jess

7
Chắc chắn rồi! +1!
Ông trùm

7
có lẽ bởi vì bạn đã không trả lời câu hỏi phương pháp mở rộng đã đi đâu. Viết của riêng bạn là một cách giải quyết kém
BritishDeveloper

13
Nó không nhất thiết là một cách giải quyết kém, nó được bản địa hóa và do đó không có khả năng bị hỏng trong các bản cập nhật nuget trong tương lai, v.v ... Tôi là tất cả cho nó.
cuộn

3
Điều này giả định rằng phản hồi có kiểu nội dung JSON.
CodeCaster

30

Nếu bạn đã sử dụng Newtonsoft.Jsonvà không muốn cài đặt Microsoft.AspNet.WebApi.Client:

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());

9

Bạn có thể viết phương thức gia hạn:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}

Đó là những gì tôi đã làm - Tôi sẽ không kéo toàn bộ DLL cho phương thức 2 dòng.
Liz

5

Chỉ cần nhấp chuột phải vào dự án của bạn, hãy quản lý Tìm kiếm Gói NuGet cho Microsoft.AspNet.WebApi.Client cài đặt nó và bạn sẽ có quyền truy cập vào phương thức tiện ích mở rộng.


3
Ai đang phàn nàn về điều gì?
David Pfeffer

0

Đã nhấn cái này một vài lần và làm theo một loạt các đề xuất, nếu bạn không thấy nó có sẵn sau khi cài đặt NuGet Microsoft.AspNet.WebApi.Client, hãy thêm một tham chiếu từ thư mục gói trong giải pháp vào:

\Microsoft.AspNet.WebApi.Client.5.2.6\lib\net45\System.Net.Http.Formatting.dll

Và đừng mắc vào cái bẫy của việc thêm các tham chiếu cũ hơn vào System.Net.Http.Formatted.dll NuGet

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.