سؤال

أنا أحاول أن أرسل بعض المحتوى إلى العميل قبل القيام ببعض مطولة العمل:

Response.Write("Processing...");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();

في فايرفوكس يعمل كما هو متوقع ولكن في IE8, سفاري و كروم فإنه ينتظر حتى كل رمز يتم معالجتها ثم يظهر النص كله.

لقد حاولت إرسال أفضل شكلت HTML مثل أدناه عينة ولكن يمكنني الحصول على نفس النتائج:

Response.Write("<html><head><title>test</title></head><body>Processing...</body></html>");
Response.Flush();
System.Threading.Thread.Sleep(5000);
Response.Write("Finish");
Response.End();

شكرا لك!

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

المحلول

والمشكلة التي تواجهها هي أن الاستجابة التي تقوم بإرسالها لا تزال غير مكتملة. حتى ولو كنت طرد كل ما هو في المخازن المؤقتة للمتصفح، فإنه لا يزال حتى المتصفح لانتظار نهاية استجابة أو معالجة ما حصلت عليه حتى الآن - وبالتالي الفرق بين المتصفحات.

ما هو أسوأ من ذلك هو أنك يمكن أن نتوقع نفس السلوك من بعض مركزات المتوسطة العقد، والجدران النارية، وما إلى ذلك تقع على شبكة الانترنت بين الخادم والمستعرض.

وخلاصة القول هي أنه إذا كنت تريد التأكد من أن المتصفح لا شيء مع دفق البيانات الخاصة بك لديك لإكمال مع Response.End.

وبعبارة أخرى إذا كنت ترغب في إرسال بعض البيانات ردكم أولا وتأخير ارسال بقية الخيار الأفضل هو لكسر في اثنين من استجابة، واستكمال أول واحد وتحميل الجزء الثاني بشكل منفصل

نصائح أخرى

طريقة سهلة لحل هذه هو وضع "يرجى الانتظار وتجهيز" صفحة أمام الصفحة الفعلية التي لا تعمل."الرجاء الانتظار يتم عرض رسالة" وبعد ذلك يبدأ على الفور المعالجة باستخدام تحديث ميتا الوسم و/أو جافا سكريبت لإعادة توجيه إلى المعالجة الفعلية الصفحة.

"الرجاء الانتظار" الصفحة:

<html>
<head>
  <meta http-equiv="refresh" content="0;url=process.aspx?option1=value&...." />
  <title>Please Wait, Processing</title>
</head>
<body>
  Processing...
</body>
<script type="text/javascript">
  window.location = "process.aspx?option1=value&....";
</script>
</html>

ملاحظات:

  1. باستخدام طريقتين لبدء تجهيز يتم التأكد إذا كان المتصفح لا يمكن استخدام واحد ، نأمل أن استخدام أسلوب آخر.
  2. سيكون لديك ليحل محل تجهيز url querystring لتناسب.
  3. الجانب السلبي واحد من هذه الطريقة هو أنه إذا كان المستخدم يضرب المتصفح الزر مرة أخرى, أنها سوف تكون العودة إلى "الرجاء الانتظار" صفحة من "عملية" الصفحة, وهذا يعني أنه سوف بطريق الخطأ يبدأ العمل مرة أخرى.سأترك هذا التحدي عن موضوع آخر!

وأيضا، أن ندرك أنه إذا ملقم IIS يتم ضغط الناتج مع GZIP، بعد ذلك سوف يبدو أن تجاهل جميع المكالمات Response.Flush.

ويتم تشغيل هذا على افتراضيا في IIS7 وعلى ويندوز 7.

و، إذا كنت اختبار مع عازف الكمان، تأكد من تشغيل وضع "الجري"، أو سوف عازف الكمان جمع HTML مسح والاحتفاظ بها حتى يتم الانتهاء من الاتصال.

عند استدعاء Response.Flush () قبل اكتمال عملية الاستجابة (قبل ومن المعروف طول المحتوى)، ووقت التشغيل ASP.NET يولد استجابة جزئية المقسم ترميز. والامر متروك للمتصفح أن يقرر كيفية تقديم ذلك. في بلدي التجارب لقد وجدت أن المتصفحات لا تميل إلى تقديم الصور (العلامات <img>) التي تم تضمينها في استجابة جزئية. قد تعطي هذا المحاولة.

ولكن، كن حذرا حول إرسال </html> في وقت قريب جدا. المتصفحات قد تجاهل أي شيء في الماضي أن نقطة. المتصفحات لا تجعل صفحات جزئية في كل وقت، على الرغم من - حتى يمكنك البدء مع بداية هذه الصفحة كالمعتاد

في حالة أنه من المفيد، امشي من خلال مثال على ذلك بالتفصيل في كتابي، بما في ذلك أثر الحزمة التي تبين بالضبط ما يحدث على السلك: <لأ href = "http://tinyurl.com/89lf5xm" يختلط = "نوفولو noreferrer"> بسرعة فائقة ASP.NET .

وأعتقد المتصفحات الحصول على واستخدام المحتوى بناء على طوله، لذلك يمكنك محاولة الحشو 1000 حرف أو نحو ذلك. على سبيل المثال:

وسلسلة myVeryShortMessage = "قيد التنفيذ ..."؛

وResponse.Write (myVeryShortMessage.PadRight (1000))؛ Response.Flush ()؛

وSystem.Threading.Thread.Sleep (5000)؛

وResponse.Write ( "إنهاء" .PadRight (1000))؛ Response.Flush ()؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top