Pregunta

Tengo una clase muy simple usando HttpListener recibir un HTTP POST desde un navegador a través de una petición AJAX. He incluido una demostración que pone de relieve este problema:

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());
        }
    }
 }

También utilice el siguiente Javascript en Firefox (usando 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
            }
   });
}

El problema que estoy teniendo es que InputStream solamente siempre contiene alrededor de 900 bytes cuando se envían desde Firefox. Si coloco violinista entre Firefox y mi aplicación, envía correctamente todos 9.900 bytes. Pero cuando se envía directamente desde Firefox a mi aplicación, sólo los primeros 900 caracteres (codificados como UTF-8, por lo que 900 bytes) son enviados.

Si utilizo curl para publicar datos en mi aplicación, funciona perfectamente. El violinista también es capaz de publicar datos en mi aplicación y que se lea correctamente. El violinista es capaz de leer los datos enviados a la misma desde Firefox, pero mi aplicación no puede.

Con diferentes tamaños de html, diferentes cantidades se envían, pero es siempre el mismo tamaño para las mismas páginas. Independientemente de su tamaño, siempre es entre 899 y 999 bytes enviados. Si una página está en 900 bytes, funciona correctamente y lee todos los datos desde el InputStream.

Una de las teorías que tenía era que podría estar enviando 1024 bytes, pero las cabeceras http fueron consumiendo algo de esos bytes, pero las cabeceras HTTP son considerablemente más grandes que ~ 120 bytes.

Una cosa que debo mencionar es que este JS está en funcionamiento desde el interior de una extensión para Firefox con jQuery importado. No creo que está causando el problema, aunque, como me encuentro con este mismo problema cuando se ejecuta la misma Javascript desde dentro de la página.

¿Fue útil?

Solución

ReadToEnd funciona para mí

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

y así lo hace por el contenido binario

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top