读取WebResponse响应的最简单方法

46
private void RespCallback(IAsyncResult asynchronousResult)
{
    try
    {
        WebRequest myWebRequest1 = (WebRequest)asynchronousResult.AsyncState;

        // End the Asynchronous response.
        WebResponse webResponse = myWebRequest1.EndGetResponse(asynchronousResult);
    }
    catch (Exception)
    {
        // TODO:Log the error
    }
}

现在有了 webResponse 对象,最简单的方法是如何读取其内容?

3个回答

55

我只需使用 WebClient 上的异步方法 - 更易于使用:

        WebClient client = new WebClient();
        client.DownloadStringCompleted += (sender,args) => {
            if(!args.Cancelled && args.Error == null) {
                string result = args.Result; // do something fun...
            }
        };
        client.DownloadStringAsync(new Uri("http://foo.com/bar"));

回答这个问题,假设它是文本,可以使用以下代码(注意你可能需要指定编码):

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            string result = reader.ReadToEnd(); // do something fun...
        }

关于第二个选项,即使用GetResponseStream。我认为你应该释放响应流,而不仅仅是StreamReader,例如通过将代码包装到第二个“using”结构中。在第一个“using”中,您可以获取流对象的引用,在第二个“using”中,您可以创建StreamReader。 - pholpar

13

如果响应来自XML,这是一种处理方式。

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("https://www.yoururl.com");
WebResponse response = myReq.GetResponse();
Stream responseStream = response.GetResponseStream();
XmlTextReader reader = new XmlTextReader(responseStream);
while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Text)
    {
        Console.WriteLine("{0}", reader.Value.Trim());
    }                       
    Console.ReadLine();
}

该流必须使用 using 块进行包装。 - Jayee
@Jayee 不,你也可以稍后处理它。 - Emaborsa

9
internal string Get(string uri)
{
    using (WebResponse wr = WebRequest.Create(uri).GetResponse())
    {
        using (StreamReader sr = new StreamReader(wr.GetResponseStream()))
        {
            return sr.ReadToEnd();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接