يحصل HttPlistener فقط على 900 بايت من InputStream عند استخدام jQuery.Ajax ()

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

سؤال

لدي فئة بسيطة للغاية باستخدام httplistener لتلقي منشور HTTP من متصفح عبر طلب AJAX. لقد قمت بتضمين عرض توضيحي يسلط الضوء على هذه المشكلة:

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

أستخدم أيضًا JavaScript التالي في Firefox (باستخدام 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
            }
   });
}

المشكلة التي أواجهها هي أن InputStream لا تحتوي إلا على حوالي 900 بايت عند إرسالها من Firefox. إذا وضعت Fiddler بين Firefox وتطبيقي ، فإنه يرسل بشكل صحيح جميع البايتات 9900. ولكن عند إرسالها مباشرة من Firefox إلى تطبيقي ، يتم إرسال أول 900 Chars (المشفرة باسم UTF8 ، لذلك 900 بايت).

إذا استخدمت Curl لنشر البيانات إلى تطبيقي ، فهو يعمل بشكل مثالي. Fiddler قادر أيضًا على نشر البيانات إلى تطبيقي وجعله يقرأ بشكل صحيح. Fiddler قادر على قراءة البيانات المنشورة عليها من Firefox ، لكن تطبيقي لا يمكنه ذلك.

مع أحجام مختلفة من HTML ، يتم إرسال كميات مختلفة ، لكنها باستمرار بنفس الحجم لنفس الصفحات. بغض النظر عن الحجم ، فإنه دائمًا ما يكون بين 899 و 999 بايت. إذا كانت الصفحة أقل من 900 بايت ، فإنها تعمل ويقرأ بشكل صحيح جميع البيانات من InputStream.

كانت إحدى النظريات التي كانت لدي أنها قد ترسل 1024 بايت ، لكن رؤوس HTTP كانت تستهلك بعض تلك البايتات ، لكن رؤوس HTTP أكبر بكثير من ~ 120 بايت.

شيء واحد يجب أن أذكره هو أن هذا JS يركض من داخل امتداد Firefox مع استيراد jQuery. لا أعتقد أن هذا يسبب المشكلة ، حيث أواجه هذه المشكلة نفسها عند تشغيل نفس JavaScript من داخل الصفحة.

هل كانت مفيدة؟

المحلول

القراءة تعمل من أجلي

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

وكذلك هذا للمحتوى الثنائي

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top