Pergunta

Eu tenho uma aula muito simples usando o HTTPListener para receber uma postagem HTTP de um navegador por meio de uma solicitação AJAX. Incluí uma demonstração que destaca esta edição:

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

Eu também uso o seguinte JavaScript no 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
            }
   });
}

O problema que estou tendo é que o InputStream apenas contém cerca de 900 bytes quando enviado do Firefox. Se eu colocar o violino entre o Firefox e meu aplicativo, ele enviará corretamente todos os 9.900 bytes. Mas ao enviar diretamente do Firefox para o meu aplicativo, apenas os primeiros 900 chars (codificados como UTF8, então 900 bytes) são enviados.

Se eu usar o CURL para postar dados no meu aplicativo, ele funciona perfeitamente. O Fiddler também pode postar dados no meu aplicativo e ler corretamente. Fiddler é capaz de ler os dados publicados no Firefox, mas meu aplicativo não pode.

Com tamanhos diferentes de HTML, quantidades diferentes são enviadas, mas é consistentemente do mesmo tamanho para as mesmas páginas. Independentemente do tamanho, é sempre entre 899 e 999 bytes enviados. Se uma página tiver menos de 900 bytes, ele funciona e lê corretamente todos os dados do InputStream.

Uma teoria que eu tinha era que poderia estar enviando 1024 bytes, mas os cabeçalhos HTTP estavam consumindo alguns desses bytes, mas os cabeçalhos HTTP são consideravelmente maiores que ~ 120 bytes.

Uma coisa que devo mencionar é que este JS está indo de uma extensão do Firefox com o jQuery importado. Eu não acho que isso esteja causando o problema, pois eu encontro esse mesmo problema ao executar o mesmo JavaScript de dentro da página.

Foi útil?

Solução

ReadToEnd funciona para mim

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

E isso faz isso para conteúdo binário

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top