Httplistener получает только первые 900 байтов ввода при использовании jquery.ajax ()

StackOverflow https://stackoverflow.com/questions/3443179

Вопрос

У меня очень простой класс, использующий httplistener, чтобы получить пост http из браузера через запрос 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
            }
   });
}

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

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

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

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

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

Это было полезно?

Решение

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

_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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top