在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状态代码(如果失败)而不是两次?
感谢。
答案 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。