asp net core 中的静态文件缓存

Static file caching in asp net core

我正在尝试启用静态文件缓存,但似乎没有效果,至少在浏览器中我找不到名称为 cache-control

的响应 header

这是我的代码

        app.UseSpaStaticFiles(new StaticFileOptions
        {
            RequestPath = _settings.SpaRoute,                
        });


            app.UseStaticFiles(new StaticFileOptions
            {
                OnPrepareResponse = ctx =>
                {
                    // Cache static files for 30 days
                    ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=2592000");
                    ctx.Context.Response.Headers.Append("Expires", DateTime.UtcNow.AddDays(30).ToString("R", CultureInfo.InvariantCulture));
                }
            });

在本地环境中构建和 运行 我的应用程序后,我得到了以下响应 headers

如您所见,这里没有缓存控件 header,我做错了什么?

StaticFileMiddlewareterminal middleware, i.e. it short-circuits the request and never calls the next middleware in chain if it comes across a static file request that doesn't match an endpoint (among other conditions).

这意味着如果你多次调用 app.UseStaticFiles(),它会在中间件链中插入 StaticFileMiddleware 不止一次,只有链中的第一个会处理请求,其余的会保持休眠。

在控制器操作中放置一个断点并检查调用堆栈,看看堆栈中是否有多个 StaticFileMiddleware。如果这样做,请删除未使用的那些,或者将您在此处的配置移至第一个。

在你的代码中,你似乎有 app.UseSpaStaticFiles, which calls app.UseStaticFiles,所以它在你自己的 app.UseStaticFiles(/*custom options*/) 之前生效。

要解决这个问题,只需将 OnPrepareResponse 传递给该中间件即可:

app.UseSpaStaticFiles(new StaticFileOptions {
    RequestPath = _settings.SpaRoute, 
    OnPrepareResponse = ctx =>
    {
        // Cache static files for 30 days
        ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=2592000");
    }               
});