Чтение данных из открытого потока HTTP

Я пытаюсь использовать классы .NET WebRequest / WebResponse для доступа к потоковому API Twitter."http://stream.twitter.com/spritzer.json".

Мне нужно иметь возможность открывать соединение и считывать данные постепенно из открытого соединения.

В настоящее время, когда я звонюWebRequest.GetResponse метод, он блокирует, пока весь ответ не будет загружен. Я знаю, что естьBeginGetResponse метод, но это будет делать то же самое в фоновом потоке. Мне нужно получить доступ к потоку ответов, пока загрузка продолжается. Это просто не представляется возможным для меня с этими классами.

В документации Twitter есть конкретный комментарий по этому поводу:

& quot; Обратите внимание, что некоторые клиентские библиотеки HTTP возвращают тело ответа только после того, как соединение было закрыто сервером. Эти клиенты не будут работать для доступа к потоковому API. Вы должны использовать HTTP-клиент, который будет возвращать данные ответа постепенно. Большинство надежных клиентских библиотек HTTP обеспечат эту функциональность. Например, Apache HttpClient будет обрабатывать этот вариант использования. & Quot;

Они указывают на Appache HttpClient, но это мало помогает, потому что мне нужно использовать .NET.

Любые идеи, возможно ли это сWebRequest/WebResponse, или я должен пойти на сетевые классы более низкого уровня? Может быть, есть другие библиотеки, которые позволят мне сделать это?

Спасибо Аллен

Ответы на вопрос(4)

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();
}
 user10868704 июл. 2009 г., 12:00
Я не могу использовать WebRequest.BeginGetRequestStream, потому что я не пытаюсь записывать данные асинхронно на сервер. Также в вашем примере вы вызываете GetResponse. Именно в этот момент веб-запрос блокируется во время загрузки ответа сервера. Но соединение никогда не закрывается, потому что это практически бесконечный поток данных.

WebClient, Он разработан для простых случаев, подобных этому, когда вам не нужна полная мощность WebRequest.

System.Net.WebClient wc = new System.Net.WebClient();
Console.WriteLine(wc.DownloadString("http://stream.twitter.com/spritzer.json"));
 05 июл. 2009 г., 05:01
О, вам нужно передавать данные? Виноват.
 user10868704 июл. 2009 г., 12:04
Как именно веб-клиент позволяет мне получать инкрементные данные из открытого потокового HTTP-соединения? Все методы WebClient.Download * пытаются загрузить весь ответ. Мне нужно взять дополнительные, бесконечные блоки бесконечного потока данных HTTP.
 14 авг. 2014 г., 06:06
Отрицательный балл ... Вы должны прочитать вопрос, прежде чем ответить на него :(

который работает нормально. Тем не менее, было бы интересно узнать, возможно ли это с помощью 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());
    }
}
}
 05 июл. 2009 г., 05:04
Является ли \ a \; \ n? необходимо?
 01 июн. 2011 г., 05:15
Поток, возвращаемый client.GetStream (), на самом деле потоковый из сетевого стека или это просто поток кэшированной памяти?
 05 июл. 2009 г., 11:17
Да, HTTP это линейно-ориентированный протокол. Вам нужно разделить команды по \ r \ n.

BeginGetResponse это метод, который вам нужен. Это позволяет вам читать поток ответов постепенно:

{
    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 (Лично я предпочитаю это по 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();
 user10868708 июл. 2009 г., 17:59
Я не пробовал этого, потому что предполагал, что req.EndGetResponse будет блокировать точно так же, как и req.GetResponse, оставляя меня с той же проблемой. Я дам ему шанс.
 11 мая 2016 г., 20:53
@ Darin Dimitrov, как вы справляетесь с тайм-аутами, если между поступающими в поток данными имеются большие промежутки времени?
 01 сент. 2010 г., 21:45
Я попробовал это без всякой удачи. Поток, возвращаемый .GetResponseStream (), является MemoryStream, содержащим все содержимое ответа.

Ваш ответ на вопрос