.NET Core 中有等價的 HttpContext.Response.Cache 嗎?

諮詢區

  • jackmusick

我想禁掉瀏覽器緩存,這樣我的client端每次都能看到server端的最新內容,在 asp.net 時代可以這麼寫。


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);
    }
}

但在 asp.net core 項目中我發現並沒有 HttpContext.Response.Cache 屬性,請問是否有其他可替換的方式?

回答區

  • Darin Dimitrov

你可以直接在 response header 上添加你需要設置的值,參考如下代碼:


public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
        filterContext.HttpContext.Response.Headers["Expires"] = "-1";
        filterContext.HttpContext.Response.Headers["Pragma"] = "no-cache";

        base.OnResultExecuting(filterContext);
    }
}

  • mk_yo

在 asp.net core 中,ResponseCache 特性被保留了下面,所以你可以像下面這樣設置。


    [ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
    public class HomeController : Controller
    {

    }

  • Marco Alves

如果你需要在全局作用域上禁用,可以利用 Middleware 機制實現,參考如下代碼。


namespace Onsolve.ONE.WebApi.Middlewares
{
    public sealed class RequestHandlerMiddleware
    {
        private readonly RequestDelegate next;
        private readonly ILogger logger;

        public RequestHandlerMiddleware(ILogger<RequestHandlerMiddleware> logger, RequestDelegate next)
        {
            this.next = next;
            this.logger = logger;
        }

        public async Task Invoke(HttpContext context)
        {
            await next(context);

            context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
            context.Response.Headers["Expires"] = "-1";
            context.Response.Headers["Pragma"] = "no-cache";
        }
    }
}

點評區

這功能好,讓瀏覽器實時查看server端內容,尤其是集成到中間件中,學習了。


本文分享自微信公衆號 - 一線碼農聊技術(dotnetfly)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章