HttpResponseMessage에서 컨텐츠 / 메시지 가져 오기


175

HttpResponseMessage의 내용을 얻으려고합니다. 이어야 {"message":"Action '' does not exist!","success":false}하지만 HttpResponseMessage에서 가져 오는 방법을 모르겠습니다.

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

이 경우 txtBlock의 값은 다음과 같습니다.

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
}

답변:


66

GetResponse () 를 호출해야합니다 .

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

33
고맙지 만, 왜이 오류가 발생합니까? "System.Net.Http.HttpResponseMessage '에'GetResponseStream '에 대한 정의가 포함되어 있지 않으며'System.Net.Http.HttpResponseMessage '유형의 첫 번째 인수를 허용하는 확장 메소드'GetResponseStream '이 없습니다. 를 찾을 수 있습니다 "
Clem

13
@Klemzy-비동기식이라고 부릅니다. Content대신 속성을 사용해보십시오 . 상기 봐 여기 예 . 두 번째 단계로 스크롤하십시오.
Icemanind 2009

2
@Klemzy- 여기 예제를보십시오 . 두 번째 단계로 스크롤하십시오. 당신이 그것을 알아낼 수 없다면, 나는 내 대답을 편집하고 당신을 위해 예를 줄 것이다
Icemanind

17
이 답변은 완전히 논외입니다. OP는 /가 HttpClient아닌을 사용 하고 있습니다. HttpWebRequestHttpWebResponse
Maxime Rossini 2016 년

1
질문은 HttpCient와 관련이 있으며, 귀하의 응답은 오래되고 더 이상 사용되지 않는 HttpWebRequest를 기반으로합니다.
Payam

370

가장 쉬운 방법은 마지막 줄을 변경하는 것입니다.

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

이 방법으로 스트림 리더를 소개 할 필요가 없으며 확장 방법이 필요하지 않습니다.


5
왜 이것이 대답이 아닌지 잘 모르겠습니다. 특히 내용을 객체에 쉽게 직렬화 할 수 있기 때문입니다.
Jason McKindly 2016 년

3
ReadAsStringAsync는 IMHO를 잘 처리하지 못합니다.
stannius

16
await를 사용하는 대신 Response.Content.ReadAsStringAsync (). Result를 사용할 수도 있습니다.
Justin

8
응답에 이모티콘이나 다른 유니 코드 문자가 있으면 ReadAsStringAsync ()가 발생할 수 있습니다. 그것을 극복하기 위해 (허용 된 답변과 같은) 스트림을 사용해야했습니다.
은행 나무

41

다음과 같이 확장 방법을 만들 수 있습니다.

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

그런 다음 간단하게 확장 메소드를 호출하십시오.

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

나는 이것이 당신에게 도움이되기를 바랍니다 ;-)


지금까지 가장 쉬운 방법
Aage

코드에서 비동기 프로그래밍을 처리 할 수없는 경우 ... await대신 사용 .Result하거나 대신 동기 HTTP 클라이언트를 사용하십시오. 그러나 최신 코드는 그렇지 않으면 응용 프로그램이 잘못하고 있다는 신호 일 수 있습니다.
막심 로시니

9

특정 유형 (예 : 테스트 내)으로 캐스팅하려면 ReadAsAsync 확장 방법을 사용할 수 있습니다 .

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

또는 동기 코드의 경우 다음을 수행하십시오.

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

업데이트 : ReadAsAsync <> 의 일반 옵션도 있습니다.이 옵션 은 객체 선언 인스턴스 대신 특정 유형 인스턴스를 반환합니다.

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

2
객체 yourTypeInstance = 응답을 기다립니다 .Content.ReadAsAsync (typeof (YourType)); var이어야합니다. yourTypeInstance = await response.Content.ReadAsAsync <YourType> ();
Thomas. 벤츠

Request.Content.ReadAsAsync를 사용하여 Json을 구문 분석하고 끔찍한 성능을 얻었습니다.
W.Leto

4

rudivonstaden의 답변으로

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

그러나 메소드를 비동기로 만들고 싶지 않으면 사용할 수 있습니다.

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

Wait () 중요합니다. 비동기 작업을 수행하기 때문에 작업을 완료하기 전에 기다려야합니다.


3
사용하는 .Result어떤 다른?httpContent.ReadAsStringAsync().Result
MKB

.Result그 줄에서 스레드의 실행을 차단합니다 ... txtBlock.Text.Wait()wait () 호출의 블록으로 ... 기본적으로 차이가 없다는 것이 맞습니다. 그러나 txtBlock.Text.Wait()선택적 정수 매개 변수를 사용하여 이전 ReadAsStringAsync()호출이 반환 되지 않으면 GUI가 중단되지 않는 것 같습니다 . 예를 들어 다음은 1 초 이하txtBlock.Text.Wait(1000)
benhorgen

3

내가 제안하는 빠른 대답은 다음과 같습니다.

response.Result.Content.ReadAsStringAsync().Result


Result작업을 요구하지 마십시오 . 애플리케이션을 잠글 위험이 있습니다. 대신 async / await를 사용하십시오.
eltiare

나는 결코 말하지 않을 것입니다 ... 때로는 빠르고 더러워집니다. 그러나 ReadAsStringAsync()반환하지 않을 위험이 있으므로 GUI 또는 기본 응용 프로그램 스레드에서 호출하지 마십시오.
benhorgen

1

다음 이미지 T는 반환 유형으로 와야하는 사람들에게 도움이된다고 생각합니다 .

여기에 이미지 설명을 입력하십시오


0

다음 GetStringAsync방법을 사용할 수 있습니다 .

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.