2013-09-09 2 views
0

У меня есть код, который отправляет запрос GET и получает ответ в потоке. Я читаю поток с потоковой программой до конца. Вот код:C# .NET Fast (realtime) webresponse reading

Но мне не нравится, что эта программа ждет, пока все данные не будут получены до начала работы с ответом. Было бы замечательно, если я могу это сделать, как это (псевдокод):

//here sending GET request 
do 
{ 
response.append(streamPart recieved); 
//here work with response 
} while (stream not ended) 

Я попытался streamReader.Read (символ [], int32_1, int32_2), но я не могу указать int32_2, becouse я не знаю, как много символов я получил. И если я использую ReadToEnd - он ждет ответа на загрузку.

+0

Использование некоторой постоянной длины не должно вызывать никаких проблем, оно должно просто вернуть, как много осталось, если меньше длины. Можете ли вы объяснить, почему вам нужно знать длину ответа перед чтением? – mrtig

+0

Я попытался использовать 1000 как int32_2, но он вернул мне строку с пробелом huuuuge после текста. А также, он перемещает «курсор» в поток, поэтому я не получу то, что появится в этом пропущенном пробеле при его загрузке. (сейчас перепроверяем курсор abaut, не уверен) – Lokley

+0

Проверено. если я использую 10000 как int32_2, я получаю огромные пробелы (с которыми я могу справиться и огромная часть повторяющегося текста (это плохо). – Lokley

ответ

0

Чтение принимает буфер char[] и возвращает количество символов, считанных из потока. Вот пример того, как прочитать ответ на куски:

public static void Main(string[] args) 
    { 
     var req = WebRequest.Create("http://www.google.com"); 
     req.Method = "GET"; 
     req.Timeout = 5000; 
     using (var response = req.GetResponse()) 
     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      char[] buffer = new char[1024]; 
      int read = 0; 
      int i = 0; 
      do 
      { 
       read = reader.Read(buffer, 0, buffer.Length); 
       Console.WriteLine("{0}: Read {1} bytes", i++, read); 
       Console.WriteLine("'{0}'", new String(buffer, 0, read)); 
       Console.WriteLine(); 
      } while(!reader.EndOfStream); 
     } 
    } 

я не видел каких-либо посторонних белое пространство или повторяющиеся данные.

+0

Да, его работа. частично, когда я добавляю ВСЕ буфер вместо добавления части, полученной Read. Спасибо. – Lokley