ما هي أفضل طريقة للتعامل مع ذاكرة التخزين المؤقت وزر الرجوع في المتصفح؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة للتعامل مع عودة المستخدم إلى الصفحة التي تحتوي على عناصر مخزنة مؤقتًا في تطبيق asp.net؟هل هناك طريقة جيدة لالتقاط زر الرجوع (الحدث؟) والتعامل مع ذاكرة التخزين المؤقت بهذه الطريقة؟

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

المحلول

يمكنك تجربة استخدام خاصية HttpResponse.Cache إذا كان ذلك من شأنه أن يساعد:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

أو يمكن حظر التخزين المؤقت للصفحة تمامًا باستخدام HttpResponse.CacheControl, ، ولكن تم إهمالها لصالح خاصية Cache أعلاه:

Response.CacheControl = "No-Cache";

يحرر:أو يمكنك حقا بالجنون والقيام بكل ذلك باليد:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 

نصائح أخرى

بقدر ما أعرف (أو على الأقل قرأت) فمن الأفضل محاولة عدم العمل استجابة لأحداث المستخدم، بل التفكير "في الصفحة".

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

على سبيل المثال، إذا كانت الخطوة 3 تؤدي إلى بعض تغييرات البيانات، فإن المستخدم ينقر مرة أخرى (للخطوة 2) وينقر على التالي مرة أخرى، ثم يتحقق التطبيق لمعرفة ما إذا تم إجراء التغييرات.أو من الناحية المثالية، فإنه لا يجعل أي شيء صعب يتغير حتى ينقر المستخدم على "موافق" في النهاية.بهذه الطريقة، يتم تخزين كافة التغييرات ويمكنك إعادة ملء النموذج بناءً على القيم التي تم إدخالها مسبقًا عند التحميل، في كل مرة.

وآمل أن يجعل الشعور :)

RFC 2616 §13.13 يقول ان التاريخ وذاكرة التخزين المؤقت شيئان مختلفان.يجب ألا تكون هناك أي طريقة على الإطلاق لذاكرة التخزين المؤقت للتأثير على زر الرجوع.

إذا أثرت أي مجموعة من رؤوس HTTP على زر الرجوع، فهذا خطأ في المتصفح ... مع استثناء واحد.

في HTTPس تفسر المتصفحات Cache-control: must-revalidate كطلب لتحديث الصفحات عند استخدام زر الرجوع (تسميه موزيلا "وضع البنك السخيف").هذا غير مدعوم في HTTP العادي.

أفضل طريقة للتعامل معها هي على الأرجح وضع توجيه عدم التخزين المؤقت في صفحات ASP.NET الخاصة بك (أو صفحة رئيسية إذا كنت تستخدم واحدة).لا أعتقد أن هناك طريقة للتعامل مع هذا مباشرة في كود ASP.NET الخاص بك (نظرًا لأن قرار ذاكرة التخزين المؤقت يحدث على العميل).

أما بالنسبة لـ MVC، فلا أعرف كيف يمكنك تحقيق ذلك (بافتراض أنه يختلف عن ASP.NET المستند إلى نماذج الويب)؛لم أستخدمه.

عملت التعليمات البرمجية التالية بالنسبة لي في IE9+ وFF21 وأحدث Chrome:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

يمكنك وضع هذا في Page_Load() معالج الأحداث في MasterPage بحيث تتطلب كل صفحة في تطبيقك رحلة ذهابًا وإيابًا إلى الخادم عند الضغط على زر الرجوع.

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