HttpListener seulement obtient la première 900 octets de InputStream lors de l'utilisation de jQuery.ajax()

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

Question

J'ai une classe très simple à l'aide de HttpListener de recevoir un HTTP POST à partir d'un navigateur via une requête AJAX.J'ai inclus une démo qui met en évidence ce problème:

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

J'utilise aussi le code Javascript suivant dans Firefox (à l'aide de 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
            }
   });
}

Le problème que je vais avoir, c'est que InputStream jamais contient près de 900 octets lorsqu'il est envoyé à partir de Firefox.Si je place Fiddler entre Firefox et mon application, il envoie correctement tous de 9 900 octets.Mais lors de l'envoi directement à partir de Firefox à mon application, seule la première 900 caractères (encodé en UTF8, donc 900 octets) sont envoyés.

Si j'utilise curl pour publier des données de mon application, elle fonctionne parfaitement.Fiddler est également en mesure de publier des données de mon application et de le faire lire correctement.Fiddler est capable de lire les données affichées à partir de Firefox, mais mon application ne peut pas.

Avec différentes tailles de html, des montants différents sont envoyés, mais c'est toujours la même taille pour les mêmes pages.Indépendamment de la taille, c'est toujours entre 899 et 999 octets envoyés.Si une page est en vertu de 900 octets, il fonctionne correctement et lit toutes les données de l'InputStream.

Une théorie que j'ai eu est qu'il pourrait être l'envoi de 1024 octets, mais les en-têtes http ont été consommation de certains de ces octets, mais les en-têtes http sont considérablement plus grande que ~120 octets.

Une chose que je dois mentionner est que ce JS est exécuté à partir d'une extension de Firefox avec jquery importés.Je ne pense pas que la cause du problème, car je rencontre ce même problème lors de l'exécution même du Javascript à partir de l'intérieur de la page.

Était-ce utile?

La solution

ReadToEnd fonctionne pour moi

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

et ce pour le contenu binaire

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top