在ASP.NET Core App中从wwwroot提供SPA时,如何控制浏览器缓存过期

时间:2019-09-15 10:21:47

标签: c# angular asp.net-core .net-core asp.net-core-mvc

我们正在从ASP.NET Core 2.1 Web后端的wwwroot文件夹提供基于Angular SPA的生产捆绑包。 否则,此ASP.NET Core Web后端仅充当SPA的REST API。

这样做,我在Startup.cs中将以下行添加到ConfigureServices方法中:

 services.AddSpaStaticFiles(config => config.RootPath = "wwwroot");

并将其添加到Configure方法

app.UseDefaultFiles();
            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseMvc();
            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "wwwroot";
            });

这有效,但是当我在wwwroot中更新捆绑软件时,我注意到客户端并不总是选择新版本。通常,他们不得不强制在浏览器中刷新页面以获得最新版本。

AFAIK这与浏览器缓存有关。

当我部署SPA捆绑包的新版本时,如何控制该缓存的过期,以便客户端浏览器立即获取新版本?

1 个答案:

答案 0 :(得分:2)

您可以使用此代码清除缓存

      app.UseSpaStaticFiles(new StaticFileOptions()
            {
                OnPrepareResponse = ctx =>
                {
                    var headers = ctx.Context.Response.GetTypedHeaders();
                    headers.CacheControl = new CacheControlHeaderValue
                    {
                        Public = true,
                        MaxAge = TimeSpan.FromDays(0)
                    };

                }
            });


     app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";
                spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions()
                {
                    OnPrepareResponse = ctx => {
                        var headers = ctx.Context.Response.GetTypedHeaders();
                        headers.CacheControl = new CacheControlHeaderValue
                        {
                            Public = true,
                            MaxAge = TimeSpan.FromDays(0)
                        };
                    }
                };

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });