Nhận nội dung / tin nhắn từ HttpResponseMessage


175

Tôi đang cố gắng để có được nội dung của HttpResponseMessage. Nó phải là : {"message":"Action '' does not exist!","success":false}, nhưng tôi không biết, làm thế nào để lấy nó ra khỏi httpResponseMessage.

HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!

Trong trường hợp này, txtBlock sẽ có giá trị:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Vary: Accept-Encoding
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Date: Wed, 10 Apr 2013 20:46:37 GMT
  Server: Apache/2.2.16
  Server: (Debian)
  X-Powered-By: PHP/5.3.3-7+squeeze14
  Content-Length: 55
  Content-Type: text/html
}

Câu trả lời:


66

Bạn cần gọi GetResponse () .

Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();

33
Cảm ơn, nhưng tại sao tôi lại gặp lỗi này ở đây: có thể được tìm thấy "
Clem

13
@Klemzy - Bởi vì bạn đang gọi nó là Không đồng bộ. Hãy thử sử dụng Contenttài sản thay thế. Nhìn vào ví dụ ở đây . Cuộn xuống bước thứ hai.
Icemanind

2
@Klemzy - Nhìn vào ví dụ ở đây . Cuộn xuống bước thứ hai. Nếu bạn không thể tìm ra nó, tôi sẽ chỉnh sửa câu trả lời của tôi và đưa ra một ví dụ cho bạn
Icemanind

17
Câu trả lời này hoàn toàn ngoài chủ đề, OP đang sử dụng HttpClient, không phải HttpWebRequest/ HttpWebResponse.
Maxime Rossini

1
Câu hỏi liên quan đến HttpCient, câu trả lời của bạn dựa trên httpWebRequest lỗi thời và lỗi thời.
Payam

370

Tôi nghĩ cách tiếp cận dễ nhất là thay đổi dòng cuối cùng thành

txtBlock.Text = await response.Content.ReadAsStringAsync(); //right!

Bằng cách này, bạn không cần phải giới thiệu bất kỳ trình đọc luồng nào và bạn không cần bất kỳ phương thức mở rộng nào.


5
Không chắc chắn tại sao đây không phải là câu trả lời được chấp nhận, đặc biệt là vì điều này mang đến cho bạn khả năng dễ dàng tuần tự hóa nội dung vào các đối tượng của bạn.
Jason McKindly

3
ReadAsStringAsync không xử lý lỗi IMHO tốt.
stannius

16
Bạn cũng có thể sử dụng Feedback.Content.ReadAsStringAsync (). Kết quả thay vì sử dụng await
Justin

8
Coi chừng: ReadAsStringAsync () có thể ném nếu bạn có biểu tượng cảm xúc hoặc một số ký tự Unicode khác trong phản hồi. Tôi đã phải sử dụng Luồng (như trong câu trả lời được chấp nhận) để khắc phục điều đó.
Ginkgo

41

Hãy thử điều này, bạn có thể tạo một phương thức mở rộng như thế này:

    public static string ContentToString(this HttpContent httpContent)
    {
        var readAsStringAsync = httpContent.ReadAsStringAsync();
        return readAsStringAsync.Result;
    }

và sau đó, đơn giản gọi phương thức mở rộng:

txtBlock.Text = response.Content.ContentToString();

Tôi hy vọng điều này sẽ giúp bạn ;-)


Cho đến nay, dễ nhất để đứng dậy và chạy
Aage

Vui lòng sử dụng awaitthay vì .Result... hoặc sử dụng máy khách HTTP đồng bộ thay vào đó, nếu mã của bạn không thể xử lý lập trình không đồng bộ. Nhưng bất kỳ mã hiện đại nào cũng nên, nếu không đó có thể là dấu hiệu ứng dụng của bạn đang làm gì đó sai.
Maxime Rossini

9

Nếu bạn muốn chuyển nó thành loại cụ thể (ví dụ: trong các thử nghiệm), bạn có thể sử dụng phương pháp tiện ích mở rộng ReadAsAsync :

object yourTypeInstance = await response.Content.ReadAsAsync(typeof(YourType));

hoặc sau đây cho mã đồng bộ:

object yourTypeInstance = response.Content.ReadAsAsync(typeof(YourType)).Result;

Cập nhật: cũng có tùy chọn chung của ReadAsAsync <> trả về thể hiện loại cụ thể thay vì đối tượng được khai báo:

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();

2
object yourTypeInstance = await answer.Content.ReadAsAsync (typeof (YourType)); nên là var yourTypeInstance = await answer.Content.ReadAsAsync <YourType> ();
Thomas.Benz

Tôi đã sử dụng Request.Content.ReadAsAsync để phân tích Json và có hiệu suất khủng khiếp.
W.Leto

4

Bằng câu trả lời của rudivonstaden

`txtBlock.Text = await response.Content.ReadAsStringAsync();`

nhưng nếu bạn không muốn làm cho phương thức không đồng bộ, bạn có thể sử dụng

`txtBlock.Text = response.Content.ReadAsStringAsync();
 txtBlock.Text.Wait();`

Đợi () điều đó quan trọng, vì chúng ta đang thực hiện các hoạt động không đồng bộ và chúng ta phải đợi nhiệm vụ hoàn thành trước khi tiếp tục.


3
sử dụng .Resultcó khác nhau không?,httpContent.ReadAsStringAsync().Result
mkb

.Resultsẽ chặn thực thi của luồng trên dòng đó ... trong đó txtBlock.Text.Wait()các khối trong lệnh chờ () ... vì vậy bạn chính xác rằng về cơ bản không có sự khác biệt. Nhưng tôi nghi ngờ txtBlock.Text.Wait()sẽ lấy tham số nguyên tùy chọn để GUI không bị treo nếu ReadAsStringAsync()cuộc gọi trước đó không bao giờ trả lại. Ví dụ: phần sau sẽ chặn không quá 1 giâytxtBlock.Text.Wait(1000)
benhorgen

3

Câu trả lời nhanh tôi đề nghị là:

response.Result.Content.ReadAsStringAsync().Result


KHÔNG gọi Resultvào nhiệm vụ. Bạn có nguy cơ khóa ứng dụng của bạn. Sử dụng async / await thay thế.
eltiare

Tôi sẽ không nói không bao giờ ... đôi khi nhanh chóng và bẩn thỉu hoàn thành nó. Nhưng tôi đồng ý rằng bạn có nguy cơ ReadAsStringAsync()không quay lại, vì vậy hãy đảm bảo không gọi nó trên GUI hoặc luồng ứng dụng chính của bạn.
benhorgen

1

Tôi nghĩ rằng hình ảnh sau đây giúp cho những người cần phải Ttrở thành kiểu trả về.

nhập mô tả hình ảnh ở đây


0

Bạn có thể sử dụng GetStringAsyncphương pháp:

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
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.