从HttpWebRequest和HttpWebResponse获取Http状态码数字(200、301、404等)。

336

我正在尝试从返回的HttpWebRequest对象的HttpWebResponse中获取HTTP状态码数字。 我希望获得实际的数字(200、301、302、404等),而不是文本描述(“Ok”、“MovedPermanently”等)。 这个数字是否隐藏在响应对象的某个属性中?除了创建一个大的switch函数之外,还有什么其他想法吗?谢谢。

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 Bardelli
6个回答

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

HttpStatusCode(即response.StatusCode的类型)是一个枚举类型,其成员的值与HTTP状态码相匹配,例如:

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

1
但是,如果出现“connectfailure”异常的WebException,我会得到一个空响应,在这种情况下,我该如何获取HTTP状态码? - Rusty
10
如果连接失败,请求无法发送并且没有收到响应,则不会有任何 HTTP 状态码。 - Oliver
4
如何获取HTTP子状态码的值?例如,“404.13 内容长度过大”。参考链接:http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits。 - Kiquenet
13
Bonus: bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300; - Alain
15
双倍奖励;布尔类型的变量success表示响应是否成功。 - htxryan
显示剩余2条评论

254

您需要小心处理, 位于4xx和5xx范围内的服务器响应会抛出WebException异常。您需要捕获它,然后从WebException对象中获取状态码:

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

1
我很高兴你提到了4xx和5xx,因为我正在处理一个程序无法正常运行的问题。不过我应该指出,当前的.NET框架会通知你任何未捕获的异常,所以这也是一个不用费脑筋的事情。 - Joel Trauger
作为额外的奖励,以前可以使用[DebuggerNonUserCode]修饰方法,当抛出异常时,调试器不会停在该方法中。通过这种方式,可以包装和忽略设计不良的异常。但现在需要一个注册表设置 - crokusek

26
根据“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());

1
HttpWebResponse 实现了 IDisposable 接口,因此处理它可能会有些棘手。相反,您可以使用以下内容,在 using 块中声明“response”:public HttpWebResponse GetSafeResponse(HttpWebRequest request) { try { return (HttpWebResponse)request.GetResponse(); } catch (WebException we) { return (HttpWebResponse)we.Response; } } - DesertFoxAZ

20

只需将 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)

2
这是VB.NET,OP正在使用C#。 - Kemuel Sanchez
2
我正在使用 VB。很高兴有这个答案。 - Drew

0

这是我处理这种情况的方法。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接