2009-08-25 51 views
221

我想从HttpWebRequest返回HttpWebResponse对象的HTTP状态代码号。我希望得到实际的数字(200,301,302,404等),而不是文字说明。 (“Ok”,“MovedPermanently”等)数字是否埋在响应对象某处的某个属性中?除了创建一个大开关功能以外的任何想法?谢谢。从HttpWebRequest和HttpWebResponse获取Http状态代码号(200,301,404等)

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()); 
+0

对于相反的动作:httpResponse.HTTPStatusCode =(HttpStatusCode)Enum.ToObject(typeof运算(HttpStatusCode),404)) – 2017-05-03 19:20:08

回答

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

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

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

但是在引发WebException的 “connectfailure” 异常的情况下,我得到响应为空,在这种情况下我如何获取httpstatus代码 – Rusty 2014-03-20 10:33:32

+7

@rusty:如果连接失败,因此无法发送请求并且无法收到响应,则不会有任何http状态码。 – Oliver 2014-04-10 11:34:21

+3

如何获取** HTTP Substatus **值?例如,_404.13内容长度太大_参考:http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits – Kiquenet 2015-04-14 08:57:22

220

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

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

我很高兴你提到了4xx和5xx,因为我遇到了程序运行不正常的问题。我应该指出,尽管目前的.NET框架会通知你任何未捕获的异常,所以这也是一个明智之举。 – 2016-09-20 16:49:21

+0

作为一个奖励,一个曾经能够用[DebuggerNonUserCode]来装饰一个方法,并且在引发异常时调试器不会停止在该方法中。通过这种方式[设计不佳](https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/#comment-85105)可以被包装并忽略。但现在[注册表设置是必需的](https://blogs.msdn.microsoft.com/devops/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015) – crokusek 2017-10-11 02:36:03

9

按照“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()); 
0
//Response being your httpwebresponse 
Dim str_StatusCode as String = CInt(Response.StatusCode) 
Console.Writeline(str_StatusCode) 
+0

这是vb .net,OP使用C# – 2017-09-08 14:10:46

0

就要挟StatusCodeint

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