HttpWebRequest 및 HttpWebResponse에서 Http 상태 코드 번호 (200, 301, 404 등) 가져 오기


289

에서 HttpWebResponse반환 된 객체 에서 HTTP 상태 코드 번호를 가져 오려고 합니다 HttpWebRequest. 텍스트 설명 대신 실제 숫자 (200, 301, 302, 404 등)를 얻으려고했습니다. ( "Ok", "MovedPermanently"등) 응답 개체의 어딘가에 속성에 묻힌 숫자입니까? 큰 스위치 기능을 만드는 것 이외의 아이디어가 있습니까? 감사.

HttpWebRequest webRequest = (HttpWebRequest)WebRequest
                                           .Create("http://www.gooogle.com/");
webRequest.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
//Returns "MovedPermanently", not 301 which is what I want.
Console.Write(response.StatusCode.ToString());

반대 행동 : httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

답변:


402
Console.Write((int)response.StatusCode);

HttpStatusCode (의 유형 response.StatusCode)는 멤버의 값이 HTTP 상태 코드와 일치하는 열거입니다 (예 :

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}

1
그러나 webexception의 "connectfailure"예외의 경우 응답이 null로 표시됩니다.이 경우 httpstatus 코드를 얻는 방법
Rusty

10
@rusty : 연결이 실패하여 요청을 보낼 수없고 응답을받을 수없는 경우 http 상태 코드가 없습니다.
Oliver

3
HTTP 하위 상태 값은 어떻게 얻 습니까? 예 : 404.13 콘텐츠 길이가 너무 큼 참조 : iis.net/configreference/system.webserver/security/…
Kiquenet

9
보너스 :bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain

12
@ 알랭 더블 보너스; 부울 성공 = response.IsSuccessStatusCode;
htxryan

244

4xx와 5xx 범위의 서버 응답은 WebException을 발생시킵니다. 잡아서 WebException 객체에서 상태 코드를 가져와야합니다.

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}

프로그램이 제대로 작동하지 않는 데 문제가있어서 4xx와 5xx를 언급하게되어 기쁩니다. 현재 .NET 프레임 워크는 잡히지 않은 예외를 알려줄 것이므로 이것은 또한 쉬운 일이 아닙니다.
Joel Trauger

보너스로, [DebuggerNonUserCode]로 메소드를 장식 할 수 있었으며 예외가 발생해도 디버거는 해당 메소드에서 중지되지 않습니다. 이러한 방식으로 잘못 설계된 예외를 랩핑하고 무시할 수 있습니다. 그러나 지금 레지스트리 설정이 필요합니다
crokusek

21

'dtb'에 따라 HttpStatusCode를 사용해야하지만 'zeldi'에 따라 코드 응답> = 400에 특히주의해야합니다.

이것은 나를 위해 일했다 :

HttpWebResponse response = null;
HttpStatusCode statusCode;
try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException we)
{
    response = (HttpWebResponse)we.Response;
}

statusCode = response.StatusCode;
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
sResponse = reader.ReadToEnd();
Console.WriteLine(sResponse);
Console.WriteLine("Response Code: " + (int)statusCode + " - " + statusCode.ToString());

HttpWebResponse는 IDisposable을 구현하므로 다루기가 까다로울 수 있습니다. 대신 다음을 사용하여 using 블록 내에서 "응답"을 선언 할 수 있습니다. public HttpWebResponse GetSafeResponse (HttpWebRequest request) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

에 강제 StatusCodeint.

var statusNumber;
try {
   response = (HttpWebResponse)request.GetResponse();
   // This will have statii from 200 to 30x
   statusNumber = (int)response.StatusCode;
}
catch (WebException we) {
    // Statii 400 to 50x will be here
    statusNumber = (int)we.Response.StatusCode;
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.