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ステータスコードはありません。
オリバー

3
HTTPサブステータス値を取得するにはどうすればよいですか?例えば、404.13コンテンツの長さが大きすぎ参考:iis.net/configreference/system.webserver/security/...
Kiquenet

9
ボーナス:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain

12
@Alain Doubleボーナス; bool success = response.IsSuccessStatusCode;
htxryan 2016

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 2016

おまけとして、以前は[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ブロック内で「応答」を宣言できるようにする次のコードを使用できます。} catch(WebException we){return(HttpWebResponse)we.Response; }}
DesertFoxAZ

11

ただ、強制StatusCodeしますint

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;
}

4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)

1
これはvb.netで、OPはC#を使用しています
Kemuel Sanchez

2
..私はvbを使用しています。この回答がここにあったことをうれしく思います。
2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.