Frage

Ich habe eine sehr einfache Klasse mit Httplistener ein HTTP-POST von einem Browser über eine AJAX-Anforderung zu empfangen. Ich habe eine Demo, die Highlights dieser Ausgabe:

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

ich auch die folgenden Javascript in Firefox (mit 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
            }
   });
}

Das Problem, das ich habe ist, dass Input enthält immer nur rund 900 Bytes, wenn sie von Firefox gesendet. Wenn ich Fiddler zwischen Firefox und meine app setzen, sendet es richtig alle 9900 Bytes. Aber wenn sie direkt aus Firefox zu meiner App zu senden, werden nur die ersten 900 Zeichen (codiert als UTF-8, so 900 Bytes) gesendet werden.

Wenn ich curl verwenden, um Daten zu meiner app zu schreiben, es funktioniert perfekt. Fiddler ist auch in der Lage Daten zu meiner App zu schreiben und hat es richtig gelesen. Fiddler ist in der Lage, die Daten aus Firefox geschrieben zu lesen, aber mein App nicht.

Mit verschiedenen Größen von html werden unterschiedliche Mengen geschickt, aber es ist durchweg die gleiche Größe für die gleichen Seiten. Unabhängig von ihrer Größe, ist es immer zwischen 899 und 999 Byte gesendet. Wenn eine Seite unter 900 Bytes ist, es funktioniert und richtig liest alle Daten aus dem Input.

Eine Theorie, die ich hatte, war, dass es vielleicht 1024 Byte aussenden, aber die http-Header wurden einige dieser Bytes raubend, aber die HTTP-Header sind erheblich größer als ~ 120 Bytes.

Eine Sache, die ich erwähnen sollte ist, dass diese JS läuft innerhalb einer Firefox-Erweiterung mit jquery importiert. Ich glaube nicht, dass das, obwohl das Problem verursacht, als ich in das gleiche Problem laufen, wenn die gleiche Javascript innerhalb der Seite ausgeführt wird.

War es hilfreich?

Lösung

arbeitet ReadToEnd für mich

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

und so tut dies für binären Inhalt

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top