从打开的HTTP流读取数据(Reading data from an open HTTP strea

2019-06-24 23:49发布

我试图使用.NET的WebRequest / WebResponse类来访问Twitter的流API这里"http://stream.twitter.com/spritzer.json"

我需要能够打开连接,然后从打开的连接不断的读取数据。

目前,当我打电话WebRequest.GetResponse方法,它阻止,直到整个响应下载。 我知道有一个BeginGetResponse方法,但这将只是做在后台线程同样的事情。 我需要访问的响应流,而下载仍在进行之中。 这似乎并不可能我这些类。

有Twitter的文档在这个特定的评论:

“请注意,连接已经在服务器关闭后,一些HTTP客户端库只返回响应体,这些客户端将无法访问的流API工作。你必须使用一个HTTP客户端将逐步返回响应数据。最强大的HTTP客户端库将提供此功能。Apache的HttpClient的将处理这种使用情况,例如“。

他们指出,Appache HttpClient的,但没有太大的帮助,因为我需要使用.NET。

任何想法,这是否是可能WebRequest/WebResponse ,或者我必须去低级别的网络类? 可能还有其他的图书馆,让我做到这一点?

THX艾伦

Answer 1:

最后我用TcpClient的,工作正常。 仍然是有兴趣知道,如果这是可能的的WebRequest / WebResponse类虽然。 这是我的情况下,任何人的代码有兴趣:

using (TcpClient client = new TcpClient())
{

string requestString = "GET /spritzer.json HTTP/1.1\r\n";
requestString += "Authorization: " + token + "\r\n";
requestString += "Host: stream.twitter.com\r\n";
requestString += "Connection: keep-alive\r\n";
requestString += "\r\n";

client.Connect("stream.twitter.com", 80);

using (NetworkStream stream = client.GetStream())
{
    // Send the request.
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(requestString);
    writer.Flush();

    // Process the response.
    StreamReader rdr = new StreamReader(stream);

    while (!rdr.EndOfStream)
    {
        Console.WriteLine(rdr.ReadLine());
    }
}
}


Answer 2:

BeginGetResponse是你需要的方法。 它可以让你不断的读取响应流:

class Program
{
    static void Main(string[] args)
    {
        WebRequest request = WebRequest.Create("http://stream.twitter.com/spritzer.json");
        request.Credentials = new NetworkCredential("username", "password");
        request.BeginGetResponse(ar => 
        {
            var req = (WebRequest)ar.AsyncState;
            // TODO: Add exception handling: EndGetResponse could throw
            using (var response = req.EndGetResponse(ar))
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                // This loop goes as long as twitter is streaming
                while (!reader.EndOfStream)
                {
                    Console.WriteLine(reader.ReadLine());
                }
            }
        }, request);

        // Press Enter to stop program
        Console.ReadLine();
    }
}

或者,如果你感觉更舒服的WebClient (我personnally喜欢过来的WebRequest):

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential("username", "password");
    client.OpenReadCompleted += (sender, e) =>
    {
        using (var reader = new StreamReader(e.Result))
        {
            while (!reader.EndOfStream)
            {
                Console.WriteLine(reader.ReadLine());
            }
        }
    };
    client.OpenReadAsync(new Uri("http://stream.twitter.com/spritzer.json"));
}
Console.ReadLine();


Answer 3:

您是否尝试过WebRequest.BeginGetRequestStream() ?

或者是这样的:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create (http://www.twitter.com );
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream()); 

string str = reader.ReadLine();
while(str != null)
{
   Console.WriteLine(str);
   str = reader.ReadLine();
}


Answer 4:

只需使用WebClient 。 它是专为简单的情况下,像这样的,你不需要的WebRequest的全部功能。

System.Net.WebClient wc = new System.Net.WebClient();
Console.WriteLine(wc.DownloadString("http://stream.twitter.com/spritzer.json"));


文章来源: Reading data from an open HTTP stream