HttpListener получает только первые 900 байтов InputStream при использовании jQuery.ajax () - PullRequest
3 голосов
/ 09 августа 2010

У меня есть очень простой класс, использующий HttpListener для получения HTTP POST из браузера через запрос AJAX.Я включил демонстрацию, которая освещает эту проблему:

private static void HandleRequest(HttpListenerContext context)
{
    using (var inputStream = context.Request.InputStream)
    {
        for (int i = 0; i < context.Request.ContentLength64; i++)
        {
            Console.WriteLine("{0}:\t{1}", i, inputStream.ReadByte());
        }
    }
 }

Я также использую следующий Javascript в Firefox (используя jQuery):

upload_html: function(html){
   jQuery.ajax({
            type: 'POST',
            data: html,
            url: 'http://localhost:8080/api/html?url=' + escape(content.document.location),
            success: function(data) {
                 // do stuff
            }
   });
}

Проблема в том, что у меня естьInputStream всегда содержит около 900 байтов при отправке из Firefox.Если я помещу Fiddler между Firefox и моим приложением, он корректно отправит все 9900 байт.Но при отправке прямо из Firefox в мое приложение отправляются только первые 900 символов (закодированных как UTF8, то есть 900 байтов).

Если я использую curl для публикации данных в моем приложении, это работает отлично.Fiddler также может публиковать данные в моем приложении и правильно их читать.Fiddler может читать данные, отправленные на него из Firefox, но мое приложение не может.

При разных размерах html отправляются разные суммы, но это одинаково для одних и тех же страниц.Независимо от размера, оно всегда отправляется от 899 до 999 байт.Если страница меньше 900 байт, она работает и правильно читает все данные из InputStream.

Одна из моих теорий заключалась в том, что она могла отправлять 1024 байта, но заголовки http потребляли некоторые из этих байтов,но заголовки http значительно больше ~ 120 байт.

Одна вещь, которую я должен упомянуть, это то, что этот JS работает из расширения Firefox с импортированным jquery.Я не думаю, что это вызывает проблему, поскольку я сталкиваюсь с той же самой проблемой, когда запускаю тот же Javascript изнутри страницы.

1 Ответ

0 голосов
/ 28 августа 2010

ReadToEnd работает для меня

_RequestBody  = new StreamReader(_Context.Request.InputStream).ReadToEnd();

и так же для двоичного содержимого

var memoryStream = new MemoryStream();
var buffer = new byte[0xFFFF];
Stream stream = _Context.Request.InputStream;

int i = 0;
do {
  i = stream.Read(buffer, 0, 0xFFFF);
  memoryStream.Write(buffer, 0, i);
} while (i > 0);
memoryStream.Flush();
memoryStream.Position = 0;
return memoryStream;
...