【问题标题】:Get webpage page content and HTTP status code in C#在 C# 中获取网页页面内容和 HTTP 状态码
【发布时间】:2013-11-26 11:34:58
【问题描述】:

在 C# Windows 窗体应用程序中,我可以使用以下方法获取网页的内容:

string content = webClient.DownloadString(url);

我可以使用以下方法获取 HTTP 标头:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
string response = ((HttpWebResponse)request.GetResponse()).StatusCode.ToString();

有没有办法在一次访问服务器而不是两次获取内容和 HTTP 状态代码(如果失败)?

谢谢。

【问题讨论】:

  • request.GetResponse() 让你们两个都受益。你是唯一一个从中获取StatusCode的人。

标签: c#


【解决方案1】:

您可以从 HttpWebResponse 对象内的 Stream 中读取数据:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    HttpStatusCode statusCode = ((HttpWebResponse)response).StatusCode;
    string contents = reader.ReadToEnd();
}

通过这种方式,您将不得不手动检测编码,或者使用库来检测编码。您也可以将编码作为字符串从HttpWebResponse 对象中读取,如果存在,则它位于ContentType 属性内。如果页面是 Html,那么您必须对其进行解析,以了解文档顶部或头部内部可能发生的编码变化。

从 ContentType 标头读取处理编码

var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
string content;
HttpStatusCode statusCode;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
    var contentType = response.ContentType;
    Encoding encoding = null;
    if (contentType != null)
    {
        var match = Regex.Match(contentType, @"(?<=charset\=).*");
        if (match.Success)
            encoding = Encoding.GetEncoding(match.ToString());
    }

    encoding = encoding ?? Encoding.UTF8;

    statusCode = ((HttpWebResponse)response).StatusCode;
    using (var reader = new StreamReader(stream, encoding))
        content = reader.ReadToEnd();
}

【讨论】:

  • GetResponse and GetResponseStream 可以抛出异常
  • 为什么不 CharacterSetvar encoding = response.CharacterSet == "" ? Encoding.UTF8 : Encoding.GetEncoding(response.CharacterSet);
  • 我不记得在回答这个问题时CharacterSet 属性是否在那里。
【解决方案2】:

网络客户端

我假设您使用 WebClient,因为它易于处理 webrequest-to-string。不幸的是,WebClient 没有公开 HTTP 响应代码。您可以假设响应是肯定的 (2xx),除非您收到 exception and read it

try
{
    string content = webClient.DownloadString(url);
}
catch (WebException e)
{
    HttpWebResponse response = (System.Net.HttpWebResponse)we.Response;     
    var statusCode = response.StatusCode;
}

或者,如果您真的对成功代码感兴趣,您可以按照here 的说明使用反射。


HttpClient

如果您使用的是 .NET 4.5,也可以使用 HttpClient,这会公开响应代码 as explained here

using (HttpClient client = new HttpClient())
{
    HttpResponseMessage response = await client.GetAsync(url);

    string content = await response.Content.ReadAsStringAsync();
    var statusCode = response.StatusCode;       
}

HttpWebRequest

或者,您可以只使用HttpWebRequest 来获取状态和响应as explained here

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var response = (HttpWebResponse)request.GetResponse();

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream);

   string content = reader.ReadToEnd();
   var statusCode = response.StatusCode;    
}

【讨论】:

  • GetResponse and GetResponseStream 可以抛出异常
  • GetResponse 和 GetResponseStream,--将-- 抛出异常以防服务器错误(如 404),您将无法获取内容...
【解决方案3】:

我认为,您还没有意识到,在第二种情况下,您也可以访问内容(尽管获取字符串需要更多的努力)。

查看 Microsoft 文档:http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.getresponsestream(v=vs.110).aspx,它向您展示了如何从 Web 响应中获取响应流,以及如何从该流中获取字符串数据。

【讨论】:

    【解决方案4】:

    我可以使用以下方法获取 HTTP 标头: request.Method = "GET";

    GET 方法返回 HEAD 和 BODY 部分作为响应。 HTTP 还支持 HEAD 方法 - 仅返回 HEAD 部分。

    您可以使用 GetResponseStream method 从 HttpWebResponse 获取 BODY。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2018-07-13
      • 2023-03-25
      相关资源
      最近更新 更多