Domanda

Ho una classe molto semplice utilizzando HttpListener per ricevere un HTTP POST da un browser tramite una richiesta AJAX. Ho incluso una demo che mette in evidenza il 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());
        }
    }
 }

Ho anche utilizzare il seguente JavaScript in Firefox (utilizzando 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
            }
   });
}

Il problema che sto avendo è che InputStream contiene sempre e solo circa 900 byte se inviati da Firefox. Se metto Fiddler tra Firefox e la mia app, invia correttamente tutti i 9.900 byte. Ma quando si inviano direttamente da Firefox a mio app, solo i primi 900 caratteri (codificati come UTF8, quindi 900 byte) vengono inviati.

Se uso curl per inviare dati a mia app, funziona perfettamente. Fiddler è anche in grado di inviare dati a mia app e lo hanno letto correttamente. Fiddler è in grado di leggere i dati inviati ad esso da Firefox, ma la mia app non può.

Con diverse dimensioni di html, importi diversi vengono inviati, ma è sempre la stessa dimensione per le stesse pagine. Indipendentemente dalle dimensioni, è sempre compresa tra 899 e 999 byte inviati. Se una pagina è in 900 byte, funziona correttamente e legge tutti i dati dal InputStream.

Una teoria che avevo era che potrebbe essere l'invio di 1024 byte, ma le intestazioni HTTP sono stati consumando alcuni di questi byte, ma le intestazioni HTTP sono considerevolmente più grandi di ~ 120 byte.

Una cosa che vorrei menzionare è che questo JS è in esecuzione all'interno di un'estensione per Firefox con jQuery importato. Io non credo che sia la causa del problema anche se, come mi imbatto in questo stesso problema quando si esegue lo stesso Javascript all'interno della pagina.

È stato utile?

Soluzione

ReadToEnd funziona per me

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

e così fa questo per contenuto 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top