从 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 将图像从网站拉到本地文件
HttpRequest 和HttpWebRequest的区别
如何从 Silverlight 中的 HttpWebRequest.BeginGetRequestStream 更新我的 UI