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

C# 从HttpWebRequest和HttpWebResponse获取Http状态代码(200、301、404等),c#,.net,http,httpwebrequest,C#,.net,Http,Httpwebrequest,我正试图从HttpWebRequest返回的HttpWebResponse对象中获取HTTP状态代码号。我希望得到的是实际的数字(200301302404等),而不是文字描述。(“Ok”、“MovedPermanently”等)是埋藏在响应对象中某个属性中的数字吗?除了创建一个大的开关功能,还有其他想法吗?谢谢 HttpWebRequest webRequest = (HttpWebRequest)WebRequest

我正试图从
HttpWebRequest
返回的
HttpWebResponse
对象中获取HTTP状态代码号。我希望得到的是实际的数字(200301302404等),而不是文字描述。(“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());
(响应.StatusCode的类型)是成员值与HTTP状态代码匹配的枚举,例如

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

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

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

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

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

但是在webexception的“connectfailure”异常的情况下,我得到的响应为null,在这种情况下,我如何获得httpstatuscode@rusty:如果连接失败,因此无法发送请求且无法接收响应,则不会有任何http状态代码。如何获取http子状态值?例如,404.13内容长度太大引用:奖金:
bool成功=((int)response.StatusCode)>=200&((int)response.StatusCode)<300@Alain双倍奖金;bool success=response.issucessstatuscode;我很高兴你提到了4xx和5xx,因为我遇到了程序运行不正常的问题。不过我应该指出,当前的.NET framework会通知您任何未捕获的异常,因此这也是一个不需要动脑筋的问题。作为奖励,以前可以使用[DebuggerNonUserCode]来修饰方法,并且当抛出异常时,调试器不会在该方法中停止。以这种方式可以被包装和忽略。但是现在一个相反的动作:httpResponse.HTTPStatusCode=(HTTPStatusCode)Enum.ToObject(typeof(HTTPStatusCode),404))这是vb.net,OP使用的是C#…我使用的是vb。很高兴这个答案在这里。HttpWebResponse实现了IDisposable,因此处理这个问题可能很棘手。您可以改为使用以下命令,它允许您在using块中声明“response”:public HttpWebResponse GetSafeResponse(HttpWebRequest request){try{return(HttpWebResponse)request.GetResponse();}catch(WebException we){return(HttpWebResponse)we.response;}
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
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;
}