阅读回复中的文字


71
HttpWebRequest request = WebRequest.Create("http://google.com") as HttpWebRequest;  

request.Accept = "application/xrds+xml";  
HttpWebResponse response = (HttpWebResponse)request.GetResponse();  

WebHeaderCollection header = response.Headers;

谷歌在这里返回文本。怎么看?

Answers:


119

"application/xrds+xml"给我的问题是,我收到的Content-Length为0(无响应)。

删除后,您可以使用访问响应response.GetResponseStream()

HttpWebRequest request = WebRequest.Create("http://google.com") as HttpWebRequest;

//request.Accept = "application/xrds+xml";  
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

WebHeaderCollection header = response.Headers;

var encoding = ASCIIEncoding.ASCII;
using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding))
{
    string responseText = reader.ReadToEnd();
}

11
请注意,这是假设使用ASCII编码,这很可能是不正确的。
乔恩·斯基特

1
还要注意,该WebHeaderCollection行对于检索响应文本不是必需的。
山姆

1
还要注意,HTTP响应没有包装在using块中。如果响应和下一个using块之间发生异常或返回,则不会关闭连接。
2013年

@Sam感谢您进行了许多编辑尝试,但是我担心您的编辑结果在很大程度上被许多用户否决了(几个小时内只有6个)。我已经撤消了您的更改,并将尝试改善答案。
STW 2013年

我确实有一个包含的结果,HttpResponseContext但是无法读取对象中的文本(可理解的格式),例如:HttpResponseMessage response = wc.GetAsync(URI).Result; var contents = response.Content.ReadAsStringAsync(); 这里的contents变量包含一些随机数据,而不是必需的数据。
Krish

79

接受的答案未正确处理WebResponse或解码文本。此外,.NET 4.5中还有一种新方法可以做到这一点。

要执行HTTP GET并读取响应文本,请执行以下操作。

.NET 1.1版本4.0

public static string GetResponseText(string address)
{
    var request = (HttpWebRequest)WebRequest.Create(address);

    using (var response = (HttpWebResponse)request.GetResponse())
    {
        var encoding = Encoding.GetEncoding(response.CharacterSet);

        using (var responseStream = response.GetResponseStream())
        using (var reader = new StreamReader(responseStream, encoding))
            return reader.ReadToEnd();
    }
}

.NET 4.5

private static readonly HttpClient httpClient = new HttpClient();

public static async Task<string> GetResponseText(string address)
{
    return await httpClient.GetStringAsync(address);
}

我认为您应该替换"http://google.com"为参数名称address
伊恩·博伊德

我很喜欢这个答案。如此简洁明了。并且它可以正确处理编码;不像公认的答案。它还显示了如何访问响应文本,这也与接受的答案不同。
伊恩·博伊德

这段代码对我产生了死锁,如stackoverflow.com/a/10369275/1636247中所述。它需要.GetStringAsync(address).ConfigureAwait(false); 在工作之前。
哈曼

10

我刚刚试过了自己,它给了我一个200 OK响应,但没有内容-内容长度为0。你肯定它给你的内容?无论如何,我假设您确实有内容。

返回实际文本依赖于知道编码,这可能很棘手。它应该在Content-Type标头中,但是您必须对其进行解析等。

但是,如果这实际上是XML(例如,来自“ http://google.com/xrds/xrds.xml ”),则要容易得多。只需将XML加载到内存中,例如通过LINQ to XML。例如:

using System;
using System.IO;
using System.Net;
using System.Xml.Linq;
using System.Web;

class Test
{
    static void Main()
    {
        string url = "http://google.com/xrds/xrds.xml";
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);

        XDocument doc;
        using (WebResponse response = request.GetResponse())
        {
            using (Stream stream = response.GetResponseStream())
            {
                doc = XDocument.Load(stream);
            }
        }
        // Now do whatever you want with doc here
        Console.WriteLine(doc);
    }   
}

如果内容是XML,得到的结果为XML对象模型(无论是XDocumentXmlDocumentXmlReader)可能比具有纯文本更有价值。


干杯。正是我想要的。
Nollaig 2013年

您需要检查流是否为空吗?(推荐人)
Coops

嗯,目前也不清楚反编译方法,为安全起见,请检查是否为null
Coops 2015年

1
@CodeBlend:那又做什么呢?如果它是一个预期的情况下,我想抛出一个异常...这是你传递会发生什么nullXDocument.Load呢,所以没有好处IMO。我通常不喜欢“以防万一,即使我认为它永远也做不到”。有一个时间和一个地方,但是如果您对每种方法都采用这种方法,那么结果将是一团糟。
乔恩·斯基特

2
@CodeBlend:好吧,如果检查并发现它空,该怎么办?在大多数情况下,您基本上无法继续进行操作,因此您想抛出一个异常,说某件事出乎意料的为空-并且这肯定是NullReferenceException或ArgumentNullException将为您执行的操作……
Jon Skeet 2015年

2
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.google.com");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string strResponse = reader.ReadToEnd();

其他答案已经涵盖了这种方法。另外,我不认为这会使用正确的编码来解码文本。
山姆

2

本文对使用HttpWebResponse对象进行了很好的概述:如何使用HttpWebResponse

以下相关位:

HttpWebResponse webresponse;

webresponse = (HttpWebResponse)webrequest.GetResponse();

Encoding enc = System.Text.Encoding.GetEncoding(1252);
StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(),enc);

string Response = loResponseStream.ReadToEnd();

loResponseStream.Close();
webresponse.Close();

return Response;

如果Web服务器使用的是Windows代码页1252作为它的编码,这是一个悲哀的一天:(你应该从响应...这是棘手的抓住它,请参阅我的回答的解决方法,在这种特殊情况下。
乔恩斯基特

h!不是我的代码:)摘自文章,它只是想通过给他提供相关内容的捷径来提供帮助。被帮助开车的危险:)
CubanX 2010年

1

response.GetResponseStream()应该用于返回响应流。而且不要忘记closeStreamResponse对象。


0

如果您的http请求是Post,request.Accept = "application/x-www-form-urlencoded"; 那么我认为您可以通过以下代码获取respone的文本:

var contentEncoding = response.Headers["content-encoding"];
                        if (contentEncoding != null && contentEncoding.Contains("gzip")) // cause httphandler only request gzip
                        {
                            // using gzip stream reader
                            using (var responseStreamReader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)))
                            {
                                strResponse = responseStreamReader.ReadToEnd();
                            }
                        }
                        else
                        {
                            // using ordinary stream reader
                            using (var responseStreamReader = new StreamReader(response.GetResponseStream()))
                            {
                                strResponse = responseStreamReader.ReadToEnd();
                            }
                        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.