如何让 IIS 从 WebApi 2 return a Custom-Cache Control Header,IIS 10 returns 每次都是私有的
How do I get IIS to return a Custom-Cache Control Header from WebApi 2, IIS 10 returns private every time
** 2021 年 1 月 27 日更新 **
我一直在与 Microsoft 就此问题进行合作,我们进行了请求跟踪并审查了 FREB 日志并确认代码正在输出正确的 headers 但在 END_REQUEST 处理程序中它们被替换为 cache-control 私人的。从头开始构建多个虚拟机后,我们了解到开箱即用,不会发生此问题。但是,当我们安装最新版本的 STACKIFY AGENT (4.29.29) 时,一旦我们将代理置于此行为上,就会发生这种情况。旧版本的 Stackify 代理(RETRACE profiler 和 APM)不会这样做,但到目前为止,这是不可逆的:一旦我们安装了 4.29.29 的 Stackify,卸载或安装旧版本并不能解决这个问题,环境不知何故永久修改。
STACKIFY 回应了一个有效的解决方案(但建议在卸载后留下一些东西):设置环境变量 STACKIFY_ENABLERUM = false ..我们尝试了这个并且 IIS returned 我们正确的 header 而不是将其替换为 cache-control: private.
我想使用 CloudFront CDN 将流量缓存到我的 API,以便将请求卸载到内容分发网络。
我正在尝试将 Cache-Control header 设置为 return: Cache-Control: "public, max-age=10" .当我 运行 我在 Visual Studio 2019 中的代码对其进行调试时,我得到了正确的 header。但是,当我将其部署到 IIS 时,我总是返回:
Cache-Control: 私有
我正在 运行宁 Windows Server 2019,IIS 版本为 10.0.17763.1。我正在使用 ASP.NET MVC 和 Web API 2 来操作 REST API.
在我的代码中我创建了这个属性:
代码:
public class CacheControlAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public int MaxAge { get; set; }
public CacheControlAttribute()
{
MaxAge = 0;
}
public override void OnActionExecuted(HttpActionExecutedContext context)
{
// Don't set the cache header if there was an error or if there was no content in the response
if (context.Response != null && context.Response.IsSuccessStatusCode)
{
context.Response.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue
{
Private = false,
Public = true,
MaxAge = TimeSpan.FromSeconds(MaxAge)
};
}
base.OnActionExecuted(context);
}
}
然后我用这个属性装饰我的方法:
[CacheControl(MaxAge = 10)]
我在 Whosebug 上阅读了几篇文章,但无法解决这个问题。我还尝试将其添加到 web.config:
没有帮助。
我在一台 IIS 服务器上成功运行,IIS 版本相同,但我的代码版本较旧。我在新的 IIS 服务器上设置它时遇到问题,我认为它是 IIS 配置问题,但我不确定。也许它在我的 web.config.
里
感谢您对此的任何帮助。
Cache-control分为请求指令和响应指令。我猜你说的是响应中的 cache-control,因为请求 cache-control 无法在 IIS 中设置。
出于安全考虑,IIS会默认将cache-control设置为private,所以你会遇到这个问题。当没有用于请求的输出缓存(并且您启用了输出缓存)时,这是 .NET 的默认行为。如果在 web.config 中将 sendCacheControlHeader 设置为 false,则不会得到 Cache-Control: private header.
所以一个简单的方法是将 sendCacheControlHeader 设置为 false 并添加 cache-control 将删除私有。您也不需要在 MVC 中自定义 cache-control 过滤器。
<system.web>
<httpRuntime sendCacheControlHeader="false" />
</system.web>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="Cache-Control" value="max-age=30,public" />
</customHeaders>
</httpProtocol>
另一个想法是为每个动作或控制器添加缓存输出。 .NET 有一个定义的过滤器来控制 maxage,你不需要自己定义它。您可以使用 [OutputCache(Duration = 0)]
您需要像这样在现有的输出缓存之上实现您自己的
public static class MyCustomCacheConfig
{
public static int Duration = 600; //whatever time you want
}
public class CdnCacheCacheAttribute : OutputCacheAttribute
{
public CdnCacheCacheAttribute()
{
this.Duration = MyCustomCacheConfig.Duration;
}
}
[CdnCacheCacheAttribute(Duration = 100, VaryByParam = "none")]
public ActionResult YourActions()
{
return View();
}
VaryByParm in output cache from Microsoft.. which controls the HttpCaching
// Get the current VaryByParam.
String varyByParamValue = outputCacheProfile.VaryByParam;
// Set the VaryByParam.outputCacheProfile.VaryByParam = string.Empty;
** 2021 年 1 月 27 日更新 ** 我一直在与 Microsoft 就此问题进行合作,我们进行了请求跟踪并审查了 FREB 日志并确认代码正在输出正确的 headers 但在 END_REQUEST 处理程序中它们被替换为 cache-control 私人的。从头开始构建多个虚拟机后,我们了解到开箱即用,不会发生此问题。但是,当我们安装最新版本的 STACKIFY AGENT (4.29.29) 时,一旦我们将代理置于此行为上,就会发生这种情况。旧版本的 Stackify 代理(RETRACE profiler 和 APM)不会这样做,但到目前为止,这是不可逆的:一旦我们安装了 4.29.29 的 Stackify,卸载或安装旧版本并不能解决这个问题,环境不知何故永久修改。
STACKIFY 回应了一个有效的解决方案(但建议在卸载后留下一些东西):设置环境变量 STACKIFY_ENABLERUM = false ..我们尝试了这个并且 IIS returned 我们正确的 header 而不是将其替换为 cache-control: private.
我想使用 CloudFront CDN 将流量缓存到我的 API,以便将请求卸载到内容分发网络。
我正在尝试将 Cache-Control header 设置为 return: Cache-Control: "public, max-age=10" .当我 运行 我在 Visual Studio 2019 中的代码对其进行调试时,我得到了正确的 header。但是,当我将其部署到 IIS 时,我总是返回:
Cache-Control: 私有
我正在 运行宁 Windows Server 2019,IIS 版本为 10.0.17763.1。我正在使用 ASP.NET MVC 和 Web API 2 来操作 REST API.
在我的代码中我创建了这个属性:
代码:
public class CacheControlAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public int MaxAge { get; set; }
public CacheControlAttribute()
{
MaxAge = 0;
}
public override void OnActionExecuted(HttpActionExecutedContext context)
{
// Don't set the cache header if there was an error or if there was no content in the response
if (context.Response != null && context.Response.IsSuccessStatusCode)
{
context.Response.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue
{
Private = false,
Public = true,
MaxAge = TimeSpan.FromSeconds(MaxAge)
};
}
base.OnActionExecuted(context);
}
}
然后我用这个属性装饰我的方法:
[CacheControl(MaxAge = 10)]
我在 Whosebug 上阅读了几篇文章,但无法解决这个问题。我还尝试将其添加到 web.config:
没有帮助。
我在一台 IIS 服务器上成功运行,IIS 版本相同,但我的代码版本较旧。我在新的 IIS 服务器上设置它时遇到问题,我认为它是 IIS 配置问题,但我不确定。也许它在我的 web.config.
里感谢您对此的任何帮助。
Cache-control分为请求指令和响应指令。我猜你说的是响应中的 cache-control,因为请求 cache-control 无法在 IIS 中设置。
出于安全考虑,IIS会默认将cache-control设置为private,所以你会遇到这个问题。当没有用于请求的输出缓存(并且您启用了输出缓存)时,这是 .NET 的默认行为。如果在 web.config 中将 sendCacheControlHeader 设置为 false,则不会得到 Cache-Control: private header.
所以一个简单的方法是将 sendCacheControlHeader 设置为 false 并添加 cache-control 将删除私有。您也不需要在 MVC 中自定义 cache-control 过滤器。
<system.web>
<httpRuntime sendCacheControlHeader="false" />
</system.web>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
<add name="Cache-Control" value="max-age=30,public" />
</customHeaders>
</httpProtocol>
另一个想法是为每个动作或控制器添加缓存输出。 .NET 有一个定义的过滤器来控制 maxage,你不需要自己定义它。您可以使用 [OutputCache(Duration = 0)]
您需要像这样在现有的输出缓存之上实现您自己的
public static class MyCustomCacheConfig
{
public static int Duration = 600; //whatever time you want
}
public class CdnCacheCacheAttribute : OutputCacheAttribute
{
public CdnCacheCacheAttribute()
{
this.Duration = MyCustomCacheConfig.Duration;
}
}
[CdnCacheCacheAttribute(Duration = 100, VaryByParam = "none")]
public ActionResult YourActions()
{
return View();
}
VaryByParm in output cache from Microsoft.. which controls the HttpCaching
// Get the current VaryByParam.
String varyByParamValue = outputCacheProfile.VaryByParam;
// Set the VaryByParam.outputCacheProfile.VaryByParam = string.Empty;