تعطيل ذاكرة التخزين المؤقت في المتصفح كامل ASP.NET الموقع

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

سؤال

أنا أبحث عن طريقة تعطيل ذاكرة التخزين المؤقت المستعرض على كامل ASP.NET MVC الموقع

لقد وجدت الطريقة التالية:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();

و أيضا العلامة الوصفية طريقة (لن تعمل بالنسبة لي لأن بعض MVC إجراءات إرسال جزئية HTML/سلمان خلال اياكس, من دون رأس ، الفوقية الوسم).

<meta http-equiv="PRAGMA" content="NO-CACHE">

ولكن أنا أبحث عن طريقة بسيطة تعطيل ذاكرة التخزين المؤقت المستعرض كامل الموقع.

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

المحلول

HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

جميع طلبات الحصول على توجيه من خلال الافتراضية.aspx الأولى - حتى على افتراض يمكنك فقط البوب في التعليمات البرمجية في الخلف هناك.

نصائح أخرى

إنشاء فئة يرث من IactionFilter.

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

ثم وضع السمات عند الحاجة ...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}

بدلا من المتداول بنفسك، ما عليك سوى استخدام ما هو مقدمة لك.

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

ما أجده يعمل بشكل أفضل هنا بدلا من رش [خرج الإخراج] في كل مكان هو استخدام فئة:

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController  : Controller
{
}

جميع وحدات التحكم الخاصة بك التي ترغب في تعطيل التخزين المؤقت للوثناء من وحدة التحكم هذه.

إذا كنت بحاجة إلى تجاوز الإعدادات الافتراضية في فئة NocacheController، ما عليك سوى تحديد إعدادات ذاكرة التخزين المؤقت على طريقة الإجراء الخاصة بك وسوف تأخذ الإعدادات في طريقة الإجراء الخاصة بك الأسبقية.

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}

قد ترغب في تعطيل التخزين المؤقت للمتصفح لجميع الصفحات المقدمة من وحدات التحكم (أي صفحات HTML)، ولكن الحفاظ على التخزين المؤقت في مكان ل موارد مثل البرامج النصية والأوراق النمطية والصور. وبعد إذا كنت تستخدم MVC4 + Bundling and Communication، فسوف ترغب في الحفاظ على فترات ذاكرة التخزين المؤقت الافتراضية للبرامج النصية والأنماط (فترات طويلة جدا، حيث يتم إبطال ذاكرة التخزين المؤقت بناء على تغيير عنوان URL فريد، لا يعتمد على الوقت).

في MVC4 +، لتعطيل التخزين المؤقت للمتصفح عبر جميع وحدات التحكم، ولكن الاحتفاظ به لأي شيء لا يخدمه وحدة تحكم، أضف هذا إلى FilterConfig.RegisterGlobalFilters:

filters.Add(new DisableCache());

حدد DisableCache كالآتي:

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

أعلم أن هذه الجواب ليس 100٪ يتعلق بالسؤال، ولكن قد يساعد شخص ما.

إذا كنت ترغب في تعطيل ذاكرة التخزين المؤقت للمتصفح ل موقع ASP.NET MVC بالكامل, ، ولكنك تريد فقط القيام بذلك مؤقتا، ثم من الأفضل تعطيل ذاكرة التخزين المؤقت في متصفحك.

Here's a screenshot in Chrome

لقد قمت بتنفيذ جميع الإجابات السابقة ولم يكن لديها عرض واحد لم يعمل بشكل صحيح.

اتضح اسم الرأي الذي كنت أواجه المشكلة مع اسمه "حديث". يبدو أن هذا مرتبك متصفح Internet Explorer.

بعد تغيير اسم العرض (في وحدة التحكم) إلى اسم مختلف (اخترت "أحدث 5")، بدأت الحلول المذكورة أعلاه.

يمكنك تجربة الرمز أدناه في ملف Global.asax.

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }

واجهة المستخدم

<%@ OutPutCache Location="None"%>
<%
    Response.Buffer = true;
    Response.Expires = -1;
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
    Response.CacheControl = "no-cache";
%>

خلفية

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Expires = -1;          
Response.Cache.SetNoStore();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top