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

时间:2013-11-26 11:34:59

标签: 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状态代码(如果失败)而不是两次?

感谢。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

<强> Web客户端

我假设你使用WebClient因为它易于webrequest-to-string处理。不幸的是,WebClient没有公开HTTP响应代码。除非得到exception and read it

,否则您可以假设答案为正(2xx
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;    
}

答案 2 :(得分:0)

我认为,你还没有意识到,在第二种情况下你也可以访问内容(虽然需要花费更多精力来获取字符串)。

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

答案 3 :(得分:0)

  

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

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

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