2016-11-22 17 views
0

Я использую поток от HttpWebRequest.GetResponse().GetResponseStream() для чтения данных из API потокового Интернета. Я использую Begin/EndRead в потоке с буфером в 65 Кбайт. Я могу видеть, что данные возвращаются в следующей схеме:HttpWebResponse Чтение потока в неровных фрагментах

16383 bytes read. 
1 bytes read. 
16383 bytes read. 
1 bytes read. 
16383 bytes read. 
1 bytes read. 
etc... 

Очевидно, что 1 байт читает ввести много неэффективности в процессе, и размер буфера я обеспечиваю достаточно большой, чтобы вместить 16384 байт или больше. Есть ли что-нибудь, что я могу сделать в качестве клиента для улучшения этого или просто до сервера, как он передает данные мне?

Читатель код в основном:

var buffer = new byte[65536]; 
using (var stream = response.GetResponseStream()) { 
    while (true) { 
     var bytesRead = await AsyncRead(stream.BeginRead, stream.EndRead, buffer); 
     Console.WriteLine($"{bytesRead} bytes read."); 
     // do something with the bytes 
    } 
} 

где AsyncRead просто вызывает BeginRead(buffer, 0, buffer.Length, callback, null), то EndRead в обратном вызове и возвращает значение, возвращаемое EndRead.

BTW это на .NET 4.0, нет HttpClient.

+0

Я не уверен, что 1 байт значительно снижает эффективность, так как http-соединение должно оставаться открытым, а передача данных, вероятно, намного медленнее, чем накладные расходы процессора, чтобы читать этот байт. Тем не менее, это странное поведение. Можете ли вы разместить соответствующие фрагменты кода читателя? – Stefan

+0

@Stefan, конечно, это на самом деле F # с использованием другой асинхронной реализации, но я перевел. В асинхронном коде ничего особенного не происходит, он просто передает параметры и возвращает значения as-is. – Asik

+2

Дикие догадки: сжатие или шифрование является виновником. Попробуйте отключить (или включить) компрессию на 'HttpWebRequest'. Аналогично, посмотрите, одинаково ли поведение на «http» и «https». Я считаю, что TLS отправляет данные в куски размером 2^14 байтов (т. Е. 16384 байта). –

ответ

-1

Что именно вы пытаетесь достичь, отправив HTTPWebRequest на целевой сервер?

Вы пытаетесь прочитать живой ответ с сервера после запроса сервера для данных или инициализации запроса между вашим клиентским приложением и целевым сервером? Если вы попытаетесь отправить HTTPWepRequest и HTTPWebResponse на целевой сервер, тогда конвертируйте ответ, полученный от сервера, в поток, а затем используйте System.IO.StreamReader для чтения входящего потока!

Затем, чтобы быть в безопасности, преобразуйте поток, который был прочитан методом System.IO.StreamReader в UTF-8, если это ваша общая цель!

После преобразования в UTF-8 вы можете распечатать выходной поток в строковое значение, которое вы можете выводить на консоль или куда хотите отправить строку вывода!

Надеюсь, это то, чего вы хотели, если не тогда, я был по существу бесполезен! : P

+0

Как читается StreamReader, чтобы помочь с моей проблемой? «Что именно вы пытаетесь достичь, отправив HTTPWebRequest на целевой сервер?» - для получения данных из API потоковой сети, как указано. – Asik

+0

Хорошо, если вы пытаетесь прочитать данные, отправленные сервером, тогда вы хотите сделать это, я просто представил вариант, если он вам нужен! – WinMister332

+0

Я читаю данные с сервера просто отлично! Боюсь, вы не поняли вопроса, но в любом случае спасибо. – Asik