使用属性在ASP.NET MVC中针对特定操作防止缓存

10 浏览
0 Comments

使用属性在ASP.NET MVC中针对特定操作防止缓存

我有一个ASP.NET MVC 3 应用程序。此应用程序通过jQuery请求记录。jQuery回调到控制器操作,该操作以JSON格式返回结果。我无法证明这一点,但我担心我的数据可能被缓存了。

我只希望缓存应用于特定操作,而不是所有操作。

是否有一个属性可以放在操作上,以确保数据不被缓存?如果没有,如何确保浏览器每次都获得新的记录集,而不是缓存的记录集?

admin 更改状态以发布 2023年5月24日
0
0 Comments

您可以使用内置的缓存属性来防止缓存。

对于.net Framework: [OutputCache(NoStore = true, Duration = 0)]

对于.net Core: [ResponseCache(NoStore = true, Duration = 0)]

请注意,无法强制浏览器禁用缓存。您能做的最好的事情是提供建议,大多数浏览器通常会遵守头部或元标签形式的建议。此装饰属性将禁用服务器缓存,并添加此头文件: Cache - Control:public,no - store,max - age = 0。它不添加元标签。如果需要,可以在视图中手动添加。

此外,JQuery和其他客户端框架将尝试通过向URL添加时间戳或GUID等内容来欺骗浏览器不使用其已缓存的资源版本。这有效地使浏览器再次请求资源,但并不能真正防止缓存。

最后,请注意。资源也可以在服务器和客户端之间缓存。ISP、代理和其他网络设备也会缓存资源,它们通常使用内部规则而不查看实际资源。这方面您无法做太多。好消息是,它们通常会以秒或分钟为单位缓存资源。

0
0 Comments

为确保JQuery不对结果进行缓存,在您的ajax方法中添加以下内容:\n\n\n

$.ajax({
    cache: false
    //rest of your ajax setup
});

\n\n\n或者为了防止MVC中的缓存,我们创建了自己的attribute,您也可以这样做。这是我们的代码:\n\n\n

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed 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);
    }
}

\n\n\n然后只需在您的controller上装饰[NoCache]。或者,如果您拥有一个基类并从中继承您的控制器,则可以将attribute放在基类的类或控制器上,就像我们在这里所做的那样:\n\n\n

[NoCache]
public class ControllerBase : Controller, IControllerBase

\n\n\n如果您需要某些操作不可缓存,可以将此attribute应用于某些操作,而不是在整个controller上应用。\n\n\n如果您的类或操作在浏览器中呈现时没有NoCache,但您想检查它是否起作用,请记住在编译更改后,您需要进行“硬刷新”(Ctrl+F5)以刷新您的浏览器。在这样做之前,您的浏览器将保留旧的缓存版本,并且不会使用“正常刷新”(F5)进行更新。

0