Asp.net core 更改Asp.net Core中静态文件的标题

Asp.net core 更改Asp.net Core中静态文件的标题,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我正在使用包Microsoft.AspNet.StaticFiles,并在Startup.cs中将其配置为app.usesticfiles()。如何更改已交付文件的标题?我想为图像、css和js设置缓存到期时间等。您必须编写一个中间件来实现这一点,我有一个示例可以删除github上的头 看看ChatLe.HttpUtility项目,它有点棘手。你也可以看看这个问题: 但是,这在IIS下不起作用,因为IIS本身管理静态文件。它只能在独立的应用程序上工作,如kestrel或firefly在IIS下

我正在使用包
Microsoft.AspNet.StaticFiles
,并在
Startup.cs
中将其配置为
app.usesticfiles()
。如何更改已交付文件的标题?我想为图像、css和js设置缓存到期时间等。

您必须编写一个中间件来实现这一点,我有一个示例可以删除github上的头
看看ChatLe.HttpUtility项目,它有点棘手。你也可以看看这个问题:


但是,这在
IIS
下不起作用,因为
IIS
本身管理静态文件。它只能在独立的应用程序上工作,如
kestrel
firefly

在IIS下,您可以使用标题配置将web.config文件添加到wwwroot文件夹。控制所有文件的缓存头的示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>

    <!-- Disable caching -->
    <httpProtocol>
      <customHeaders>
        <add name="Cache-Control" value="no-cache" />
      </customHeaders>
    </httpProtocol>

  </system.webServer>
</configuration>

您可以使用StaticFileOptions,它包含在静态文件的每个请求上调用的事件处理程序

您的Startup.cs应该如下所示:

// Add static files to the request pipeline.
app.UseStaticFiles(new StaticFileOptions()
{
    OnPrepareResponse = (context) =>
    {
        // Disable caching of all static files.
        context.Context.Response.Headers["Cache-Control"] = "no-cache, no-store";
        context.Context.Response.Headers["Pragma"] = "no-cache";
        context.Context.Response.Headers["Expires"] = "-1";
    }
});

当然,您可以修改上述代码以检查内容类型,并且只修改JS或CSS或任何您想要的标题。

如果您正在寻找一种解决方案,允许您为每个环境(开发、生产等)配置不同的行为,这也是在<强> Web.CONFIG<强文件>中进行设置的要点,而不是硬编码整个文件,您可以考虑以下方法。

在appsettings.json文件中添加以下键/值部分:

  "StaticFiles": {
    "Headers": {
      "Cache-Control": "no-cache, no-store",
      "Pragma": "no-cache",
      "Expires": "-1"
    }
  }
然后在Startup.cs文件的
Configure
方法中添加以下内容:

app.UseStaticFiles(new StaticFileOptions()
{
    OnPrepareResponse = (context) =>
    {
        // Disable caching for all static files.
        context.Context.Response.Headers["Cache-Control"] = Configuration["StaticFiles:Headers:Cache-Control"];
        context.Context.Response.Headers["Pragma"] = Configuration["StaticFiles:Headers:Pragma"];
        context.Context.Response.Headers["Expires"] = Configuration["StaticFiles:Headers:Expires"];
    }
});
这将允许开发人员使用不同的/多个/级联设置文件(
appsettings.json
appsettings.production.json
等等)定义不同的缓存设置,这可以通过旧的
web.config
配置模式来完成,也可以通过ASP.NET核心的新模式来完成

有关此主题的更多信息,我还建议您在我的博客和/或官方ASP.NET核心文档中阅读以下精彩文章:


根据Josh Mouch的上述回答,添加了代码以确定它是否是pdf文件

Startup.cs:

      app.UseStaticFiles(new StaticFileOptions
      {
        OnPrepareResponse = ctx =>
          {
            if(ctx.File.Name.ToLower().EndsWith(".pdf"))
            {
              ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=86400");
            }
            else
            {
              ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=31104000");
            }
          }
      });

你是说这三个都不能在IIS下工作吗?或者其中一个答案,特别是?如果网站承载.NET核心模块(如OP),那么这将不起作用,因为.NET核心不支持
web.config
。NET核心的工作方式本质上是运行自己的web服务器Kestrel,它隐藏在IIS+HTTP模块(又名ANCM,又名ASP.NET核心模块)后面。由于这些文件是静态文件,如.css/.js,通常应使用适当的缓存时间,而不是
“无缓存,无存储”
,以提高性能,例如:
context.context.Response.Headers[HeaderNames.CacheControl]=“public,max age=86400”(这里的86400是24小时=24*60*60秒)。为了在更新文件时强制绕过缓存,我们还可以在
旁边使用
asp append version=“true”
标记帮助程序。。。标记添加一些自动生成的查询字符串,该字符串基于将自动更新的文件的哈希值。