2013-03-11 4 views
7

에 응답 본문을 얻을 : Any way to access response body using WebClient when the server returns an error?웹 클라이언트 내가 여기 부탁 같은 것을 본질적으로 찾고 있어요 오류 상태 코드

하지만 아무도 대답은 지금까지 제공되지 않았습니다.

서버는 "400 잘못된 요청"상태를 반환하지만 상세한 오류 설명은 응답 본문으로 반환합니다.

.NET WebClient를 사용하여 데이터에 액세스하는 방법에 대한 아이디어가 있으십니까? 서버가 오류 상태 코드를 반환하면 예외가 발생합니다.

+4

다른 질문이 도움이 될 수 있습니다. http://stackoverflow.com/questions/7036491/get-webclient-errors-as-string –

+0

그리고 http://stackoverflow.com/ 질문/11828843/c-sharp-webexception-how-to-get-entire-response-a-body – I4V

답변

8

WebClient에서 웹 클라이언트를 가져올 수는 없지만 HttpWebResponse 객체로 응답 객체 캐스트를 액세스하면 전체 응답 객체에 액세스 할 수 있습니다.

자세한 내용은 WebException 클래스 정의를 참조하십시오. 다음은

은 MSDN에서 예입니다 (예외를 처리하는 가장 좋은 방법은 아니지만 그것은 당신에게 몇 가지 아이디어를 제공해야합니다) 당신은이 같은 응답 콘텐츠 검색 할 수 있습니다

try { 
    // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name. 
    HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site"); 

    // Get the associated response for the above request. 
    HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse(); 
    myHttpWebResponse.Close(); 
} 
catch(WebException e) { 
    Console.WriteLine("This program is expected to throw WebException on successful run."+ 
         "\n\nException Message :" + e.Message); 
    if(e.Status == WebExceptionStatus.ProtocolError) { 
     Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode); 
     Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription); 
    } 
} 
catch(Exception e) { 
    Console.WriteLine(e.Message); 
} 
+0

HttpWebRequest를 사용하고 있지만 WebClient에서 모든 메소드가 WebException을 반환 할 수있는 것과 동일하다는 것을 알고 있습니다. – dmportella

0

:

using (WebClient client = new WebClient()) 
{ 
    try 
    { 
     string data = client.DownloadString(
      "http://your-url.com"); 
     // successful... 
    } 
    catch (WebException ex) 
    { 
     // failed... 
     using (StreamReader r = new StreamReader(
      ex.Response.GetResponseStream())) 
     { 
      string responseContent = r.ReadToEnd(); 
      // ... do whatever ... 
     } 
    } 
} 

테스트 : on .Net 4.5.2