强制C#的HTTP响应返回状态代码而不是描述

时间:2014-02-06 15:55:25

标签: c# httpwebresponse

我目前正在使用此脚本来获取HTTP响应标头。

public static List<string> GetHttpResponseHeaders(string url)
{
    List<string> headers = new List<string>();
    WebRequest webRequest = HttpWebRequest.Create(url);
    using (WebResponse webResponse = webRequest.GetResponse())
    {
        headers.Add("Status Code: " + (int) ((HttpWebResponse) webResponse).StatusCode);
    }
    return headers;
}

具体来说,Status Code:是我感兴趣的。据说,StatusCode()实际上并没有返回“状态代码”,并且在成功请求时,它只返回{ {1}}而不是OK

有没有办法强制它返回实际代码而不是描述?

3 个答案:

答案 0 :(得分:5)

  

话虽如此,看起来StatusCode()实际上并没有返回“状态代码”,并且在成功请求时,它只返回OK而不是200.

不,它返回HttpStatusCode枚举值。如果您对具有名称的枚举值调用ToString,则会返回名称。

避免这种情况的最简单方法就是将其强制转换为int

headers.Add("Status Code: " + (int) ((HttpWebResponse) webResponse).StatusCode);

或者为了使块的其余部分更清洁,请将响应转换一次:

using (WebResponse webResponse = webRequest.GetResponse())
{
    var httpResponse = (HttpWebResponse) webResponse;
    headers.Add("URL: " + url);
    headers.Add("Status Code: " + (int) httpResponse.StatusCode);
    headers.Add("Status Description: " + httpResponse.StatusDescription + "\n");
}

(请注意,当您使用字符串连接时,如果需要,将隐式调用ToString - 并且永远不值得调用已经是字符串的StatusDescription之类的内容。)

答案 1 :(得分:2)

StatusCodeHttpStatusCode enum

您可以将其投射到int以获取基础值。

答案 2 :(得分:0)

您看到“OK”值的原因是因为属性HttpWebResponse.StatusCode的类型为HttpStatusCode - 枚举。在枚举上调用.ToString()将为您提供文本,而不是数字。

因此,当您没有看到状态代码的数值时,您会看到状态代码的表示,而不是状态描述。

如果您需要整数值,可以将枚举转换为intHttpStatusCode.OK确实具有值200) - 但值得考虑的是,无法保证枚举的整数值将与状态代码值对齐。