繁体   English   中英

在C#中获取网页内容和HTTP状态代码

[英]Get webpage page content and HTTP status code in C#

在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状态代码(如果失败)?

谢谢。

您可以在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();
}

Web客户端

我假设你使用WebClient因为它简单的webrequest-to-string处理。 不幸的是, WebClient不公开HTTP响应代码。 您可以假设响应是肯定的( 2xx ),除非您得到异常并阅读它

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

或者,如果您对成功代码真的感兴趣,可以使用此处所述的反射。


HttpClient的

如果您使用的是.NET 4.5,也可以使用HttpClient ,它会公开响应代码, 如下所述

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

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

HttpWebRequest的

或者,您可以使用HttpWebRequest获取状态和响应, 如下所述

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

我想,你还没有意识到,在第二种情况下你也可以访问内容(尽管需要花费更多的精力才能获得一个字符串)。

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

我可以使用以下命令获取HTTP标头:request.Method =“GET”;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM