Почему HttpWebResponse возвращает завершенную нулем строку? - PullRequest
0 голосов
/ 17 августа 2010

Недавно я использовал HttpWebResponse для возврата XML-данных из HttpWebRequest, и я заметил, что поток вернул мне завершенную нулевую строку.

Я предполагаю, что базовая библиотека должна быть совместима с C ++,но я не смог найти ресурс для дальнейшего освещения.

В основном мне интересно, есть ли простой способ отключить это поведение, чтобы мне не приходилось очищать строки, в которые я передаюмой читатель xml.


Отредактируйте здесь образец соответствующего кода:

httpResponse.GetResponseStream().Read(serverBuffer, 0, BUFFER_SIZE);
output = processResponse(System.Text.UTF8Encoding.UTF8.GetString(serverBuffer))

, где processResponse выглядит так:

 processResponse(string xmlResponse)
 {
     var Parser = new XmlDocument();
     xmlResponse = xmlResponse.Replace('\0',' '); //fix for httpwebrequest null terminating strings
     Parser.LoadXml(xmlResponse);

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Это определенно не нормальное поведение.Два варианта:

  • Вы допустили ошибку при чтении кода (например, создали буфер и затем вызвали Read в потоке, ожидая, что он заполнит буфер)
  • Интернетсервер на самом деле возвратил нулевой завершенный ответ

Вы должны быть в состоянии определить разницу, используя Wireshark , если ничего больше.

2 голосов
/ 17 августа 2010

Может быть, вы устанавливаете размер (неправильный размер) для буфера, который вы загружаете?

Вы можете использовать StreamReader, чтобы избежать временного буфера, если он вам не нужен.

using(var stream = new StreamReader(httpResponse.GetResponseStream()))
{
  string output = stream.ReadToEnd();
//...
}
2 голосов
/ 17 августа 2010

Хм ... Сомневаюсь, что она возвращает строку с нулевым символом в конце, поскольку в C # такого понятия просто нет.В лучшем случае у вас может быть строка с символом \0u0000 в конце, но в этом случае это будет означать, что возврат с сервера содержит такой символ, а HttpWebRequest просто выполняет свои обязанности и возвращает все, что вернул сервер.

Обновление

после прочтения вашего кода, ошибка довольно очевидна: вы Read() обращаетесь из потока в байт []но не обращая внимания на , сколько вы на самом деле прочитали :

int responseLength = httpResponse.GetResponseStream().Read(
    serverBuffer, 0, BUFFER_SIZE);
output = processResponse(System.Text.UTF8Encoding.UTF8.GetString(
    serverBuffer, 0, responseLength));

, это решило бы непосредственную проблему, оставив только другие ошибки в вашем коде, с которыми нужно иметь дело, например тот факт, чтоне может правильно обработать ответ, больший чем BUFFER_SIZE ... Я бы предложил вам открыть читатель XML-документа в возвращаемом потоке вместо манипулирования потоком с помощью (ненужной) операции копирования byte []:

Parser.Load(httpResponse.GetResponseStream());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...