dotnet 核心设置 Cache-Control 无效

Jim*_*Jim 4 c# asp.net-mvc asp.net-core-mvc kestrel-http-server asp.net-core

我已将 dotnet core 中间件配置为输出 Cache-Control 标头。我希望缓存所有静态内容,但最特别的是几个 .png 文件。缓存头没有被输出?我正在使用 dotnet core 1.1.1。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseStaticFiles(new StaticFileOptions
        {
            OnPrepareResponse = _ =>
            {
                var headers = _.Context.Request.GetTypedHeaders();
                headers.CacheControl = new CacheControlHeaderValue
                {
                    MaxAge = TimeSpan.FromHours(12)
                };
            }
        });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseIdentity();

    // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            "default",
            "{controller=Site}/{action=Site}/{id?}");
    });
}
Run Code Online (Sandbox Code Playgroud)

代码被忽略,如下面的屏幕截图所示。

在此输入图像描述

我也尝试过像这样显式添加标头,但出现错误表明标头已经存在。

app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = _ =>
    {
        _.Context.Request.Headers.Add("Cache-Control", "public,max-age=60");
    }
});
Run Code Online (Sandbox Code Playgroud)

不知何故,它被吃掉了。如果我设置断点,就会调用代码。

lev*_*ent 6

您尝试操纵请求标头。

            var headers = _.Context.Request.GetTypedHeaders();
            headers.CacheControl = new CacheControlHeaderValue
            {
                MaxAge = TimeSpan.FromHours(12)
            };
Run Code Online (Sandbox Code Playgroud)

浏览器需要响应标头,而不是请求标头。将缓存控制添加到响应标头。直接或通过 CacheHeader 属性并不重要。

_.Context.Response.Headers.Append("Cache-Control", string.Format("public,max-age={0}", TimeSpan.FromHours(12).TotalSeconds));
Run Code Online (Sandbox Code Playgroud)