【问题标题】:Getting Http Status code number (200, 301, 404, etc.) from HttpWebRequest and HttpWebResponse从 HttpWebRequest 和 HttpWebResponse 获取 Http 状态码(200、301、404 等)
【发布时间】: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))

标签: c# .net http httpwebrequest


【解决方案1】:
Console.Write((int)response.StatusCode);

HttpStatusCoderesponse.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。很高兴这个答案在这里。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2016-04-04
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多