在.NET Core中,UseResponseCompression
和 ResponseCache
属性确实可能会产生冲突,特别是在设置 Vary
标头时。以下是对这个问题的详细解释以及解决方案。
Vary
标头用于指示服务器根据请求中的某些字段(如 Accept-Encoding
)来决定响应的内容。Content-Encoding: gzip
或 Content-Encoding: brotli
等标头。Cache-Control
和 Expires
)。[ResponseCache]
属性在控制器或动作方法上设置。当同时使用 UseResponseCompression
和 ResponseCache
时,可能会遇到以下问题:
UseResponseCompression
中间件会在响应中添加 Vary: Accept-Encoding
标头。ResponseCache
属性也设置了 VaryByHeader
,可能会导致 Vary
标头被重复添加或覆盖,从而影响缓存行为。可以在 Startup.cs
中手动配置 Vary
标头,确保它只被设置一次:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSession();
app.UseResponseCompression();
app.Use(async (context, next) =>
{
context.Response.OnStarting(() =>
{
context.Response.Headers.Add("Vary", "Accept-Encoding");
return Task.CompletedTask;
});
await next();
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
.NET Core 提供了 ResponseCaching
中间件,可以更精细地控制缓存行为:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCaching();
app.Use(async (context, next) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromMinutes(10)
};
context.Response.Headers.Add("Vary", "Accept-Encoding");
await next();
});
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
通过手动设置 Vary
标头或使用 ResponseCaching
中间件,可以有效解决 UseResponseCompression
和 ResponseCache
属性之间的冲突。这些方法确保了缓存代理能够正确处理不同编码格式的响应,从而优化整体性能。
领取专属 10元无门槛券
手把手带您无忧上云