Reading data from an open HTTP stream

前端 未结 4 601
醉梦人生
醉梦人生 2021-02-02 16:23

I am trying to use the .NET WebRequest/WebResponse classes to access the Twitter streaming API here \"http://stream.twitter.com/spritzer.json\".

I need to b

相关标签:
4条回答
  • 2021-02-02 16:57

    Just use WebClient. It is designed for simple cases like this where you don't need the full power of WebRequest.

    System.Net.WebClient wc = new System.Net.WebClient();
    Console.WriteLine(wc.DownloadString("http://stream.twitter.com/spritzer.json"));
    
    0 讨论(0)
  • 2021-02-02 16:58

    I ended up using a TcpClient, which works fine. Would still be interested to know if this is possible with WebRequest/WebResponse though. Here is my code in case anybody is interested:

    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());
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-02 17:10

    BeginGetResponse is the method you need. It allows you to read the response stream incrementally:

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

    Or if you feel more comfortable with WebClient (I personnally prefer it over 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();
    
    0 讨论(0)
  • 2021-02-02 17:13

    Have you tried WebRequest.BeginGetRequestStream() ?

    Or something like this:

    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();
    }
    
    0 讨论(0)
提交回复
热议问题