يحصل HttPlistener فقط على 900 بايت من InputStream عند استخدام jQuery.Ajax ()
-
27-09-2019 - |
سؤال
لدي فئة بسيطة للغاية باستخدام 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;