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

Posted

技术标签:

【中文标题】从 HttpWebRequest 和 HttpWebResponse 获取 Http 状态码(200、301、404 等)【英文标题】:Getting Http Status code number (200, 301, 404, etc.) from HttpWebRequest and HttpWebResponse 【发布时间】:2010-11-22 18:49:33 【问题描述】:

我试图从 HttpWebRequest 返回的 HttpWebResponse 对象中获取 HTTP 状态代码编号。我希望得到实际数字(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)) 【参考方案1】:
Console.Write((int)response.StatusCode);

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

public enum HttpStatusCode

    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...

【讨论】:

但在 webexception 的“connectfailure”异常的情况下,我得到的响应为 null,在这种情况下,我怎样才能得到 httpstatus 代码 @rusty: 如果连接失败导致无法发送请求,也无法收到响应,则不会有任何http状态码。 如何获取 HTTP Substatus 值?例如,404.13 Content Length Too Large 参考:iis.net/configreference/system.webserver/security/… 红利:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300; @Alain 双倍奖励; bool 成功 = response.IsSuccessStatusCode;【参考方案2】:

您必须小心,4xx 和 5xx 范围内的服务器响应会引发 WebException。您需要捕获它,然后从 WebException 对象中获取状态码:

try

    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;

catch (WebException we)

    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;

【讨论】:

很高兴您提到了 4xx 和 5xx,因为我遇到了一个程序无法正常运行的问题。我应该指出,当前的 .NET 框架会通知您任何未捕获的异常,所以这也是一个明智的选择。 作为奖励,过去可以使用 [DebuggerNonUserCode] 装饰方法,并且当抛出异常时调试器不会停止在该方法中。以这种方式poorly designed exceptions 可以被包装和忽略。但现在registry setting is required【参考方案3】:

根据“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; 【参考方案4】:

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

【讨论】:

【参考方案5】:
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)

【讨论】:

这是vb.net,OP使用的是C# ..我正在使用 vb。很高兴这个答案在这里。

以上是关于从 HttpWebRequest 和 HttpWebResponse 获取 Http 状态码(200、301、404 等)的主要内容,如果未能解决你的问题,请参考以下文章

HttpWebRequest的Timeout和ReadWriteTimeout

HttpRequest 和HttpWebRequest的区别

如何使用 httpwebrequest 将图像从网站拉到本地文件

HttpWebRequest 和原生 GZip 压缩

HttpRequest 和HttpWebRequest的区别

如何从 Silverlight 中的 HttpWebRequest.BeginGetRequestStream 更新我的 UI