C# 从回应中读课文

C# 从回应中读课文,c#,asp.net,C#,Asp.net,这里谷歌返回文本。如何读取它?响应。应使用GetResponseStream()返回响应流。不要忘记关闭流和响应对象。您的应用程序/xrds+xml给了我问题,我收到的内容长度为0(无响应) 删除后,可以使用response.GetResponseStream()访问响应 本文很好地概述了如何使用HttpWebResponse对象: 相关位如下: HttpWebRequest request = WebRequest.Create("http://google.com") as HttpWebR

这里谷歌返回文本。如何读取它?

响应。应使用GetResponseStream()
返回响应流。不要忘记关闭
响应
对象。

您的
应用程序/xrds+xml
给了我问题,我收到的内容长度为0(无响应)

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


本文很好地概述了如何使用HttpWebResponse对象:

相关位如下:

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

我自己也尝试过,它给了我200个OK的回复,但是没有内容——内容长度是0。你确定它给了你内容吗?不管怎样,我认为你真的很满足

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

但是,如果这实际上是XML(例如,来自“”),那么就容易多了。只需将XML加载到内存中,例如通过LINQ到XML。例如:

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;
如果内容是XML,则将结果放入XML对象模型(无论是
XDocument
XmlDocument
还是
XmlReader
)可能比使用纯文本更有价值。

无法正确处理
WebResponse
或解码文本。另外,在.NET4.5中有一种新的方法可以做到这一点

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

.NET 1.1‒4.0 .NET 4.5
private static readonly HttpClient HttpClient=new HttpClient();
公共静态异步任务GetResponseText(字符串地址)
{
返回wait-httpClient.GetStringAsync(地址);
}

如果您的http请求是Post,并且
request.Accept=“application/x-www-form-urlencoded”
然后,我认为您可以通过下面的代码获取respone的文本:

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();

如果一个web服务器使用Windows代码页1252作为其编码,这将是一个令人悲伤的日子:(你应该从响应中获取它…这很棘手。请参阅我的答案以了解此特定情况下的解决方法。Doh!不是我的代码:)这是文章中的内容,只是试图通过给他一个相关位的快捷方式来帮助他。帮助驱动的危险:)请注意,这是假定ASCII编码,这可能是不正确的。还请注意,
WebHeaderCollection
行不是检索响应文本所必需的。还要注意,HTTP响应没有包装在using块中。如果在响应和下一个使用块之间发生异常或返回,连接将不会关闭。@Sam感谢您的多次编辑尝试,但是我担心您的编辑结果在很大程度上被许多用户否决(数小时内6次)。我已还原您的更改,并将尝试改进答案。我确实有一个结果,其中包含
HttpResponseContext
,但我无法将文本读入对象(可理解的格式),例如:
httpresponsemessageresponse=wc.GetAsync(URI).result
var contents=response.Content.ReadAsStringAsync()
此处
内容
变量包含一些随机数据,而不是必需的数据。我认为您应该替换
”http://google.com“
带有参数名
地址
?我非常喜欢这个答案。它是如此简明扼要。正确处理编码;与公认的答案不同。它还显示了如何访问响应文本,这也与接受的答案不同。它需要.GetStringAsync(地址).ConfigureAwait(false);在它起作用之前,干杯。正是我要找的。你需要检查流是否为空吗?(resharper推荐)嗯,查看反编译方法也不清楚,猜测检查它是否为空safety@CodeBlend:然后做什么?如果是预期的情况,我想抛出一个异常。。。这就是如果你将
null
传递给
XDocument.Load
会发生的情况,所以在我看来这没有什么好处。我一般不喜欢“以防万一,即使我认为它永远也做不到”。它是有时间和地点的,但是如果你对每一个方法都采取这种方法,你最终会陷入一个可怕的混乱。@CodeBlend:那么,如果你检查并发现它为空,你会怎么做?在大多数情况下,您基本上无法继续,因此您希望抛出一个异常,表明某些内容意外为空-这当然是NullReferenceException或ArgumentNullException为您所做的…其他答案已经涵盖了这种方式。另外,我不认为这使用了正确的编码来解码文本。
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);
    }   
}
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();
    }
}
private static readonly HttpClient httpClient = new HttpClient();

public static async Task<string> GetResponseText(string address)
{
    return await httpClient.GetStringAsync(address);
}
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();
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();
                            }
                        }