簡體   English   中英

從 HttpWebRequest 和 HttpWebResponse 獲取 Http 狀態碼號(200、301、404等)

[英]Getting Http Status code number (200, 301, 404, etc.) from HttpWebRequest and HttpWebResponse

我正在嘗試從HttpWebRequest返回的HttpWebResponse object 獲取 HTTP 狀態代碼號。 我希望得到實際數字(200、301,302、404 等)而不是文字描述。 (“Ok”、“MovedPermanently”等)數字是否隱藏在響應 object 的某個屬性中? 除了創建一個大開關 function 之外還有什么想法嗎? 謝謝。

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());
Console.Write((int)response.StatusCode);

HttpStatusCoderesponse.StatusCode的類型)是一個枚舉,其中成員的值與HTTP狀態碼匹配,例如

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

您必須小心,服務器響應在4xx和5xx范圍內會引發WebException。 您需要捕獲它,然后從WebException對象獲取狀態代碼:

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

按照“ 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());

只需將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;
}
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)

以下是我處理這種情況的方法。

//string details = ...
//...
catch (WebException ex)
{
    HttpStatusCode statusCode = ((HttpWebResponse)ex.Response).StatusCode;
    if (statusCode == HttpStatusCode.Unauthorized)
    {
        Reconnect();
        //...
    }
    else if (statusCode == HttpStatusCode.NotFound)
    {
        FileLogger.AppendToLog("[ERROR] Not Found: " + details);
    }
    else
    {
        FileLogger.AppendToLog("[ERROR] " + ex.Message + ": " + details);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM