2015-07-29 3 views
0

При получении многостраничных данных из браузера (размер которого превышает ~ 2 КБ), я начинаю получать пустые «\ 0» байты после первых нескольких кусков, которые имеют значение, когда я использую :C# - Stream.Read чтение нулевых байтов

_Stream.Read(ByteArray, Offset, ContentLength); 

Но, если я разделить ContentLength на небольшие буферы (около 2KB каждого) И добавить задержку 1мс после каждого вызова Read(), то он работает отлично:

for(int i = 0; i < x; i++) 
{ 
    _Stream.Read(ByteArray, Offset * i, BufferSize); 
    System.Threading.Thread.Sleep(1); 
} 

Но добавление задержки происходит довольно медленно. Как предотвратить чтение нулевых байтов. Как узнать, сколько байтов было написано браузером.

Благодаря

ответ

2

В 0x00 байты фактически не были получены, они никогда не были записаны.

Stream.Read() возвращает количество фактически прочитанных байтов, которое в вашем случае часто меньше BufferSize. Небольшое количество данных обычно поступает в одно сообщение, и в этом случае проблема не возникает.

Задержка может «работать» в вашем тестовом сценарии, потому что к тому времени сетевой уровень забуферировал более BufferSize данных. Вероятно, он будет работать в производственной среде.

Так что вам необходимо изменить свой код во что-то вроде:

int remaining = ContentLength; 
int offset = 0; 
while (remaining > 0) 
{ 
    int bytes = _Stream.Read(ByteArray, offset, remaining); 
    if (bytes == 0) 
    { 
     throw new ApplicationException("Server disconnected before the expected amount of data was received"); 
    } 

    offset += bytes; 
    remaining -= bytes; 
} 
Смежные вопросы