如何在.NET Core 5的Startup.cs中全局设置VaryByQueryKeys = new[] { "*" }
.NET Core 5 全局配置VaryByQueryKeys实现方案
你可以通过以下两种方式在Startup.cs中完成全局配置,无需单独给每个控制器加特性:
方式1:配置响应缓存中间件全局规则
在ConfigureServices方法中添加响应缓存服务时直接配置全局参数:
public void ConfigureServices(IServiceCollection services) { // 其他服务配置... services.AddResponseCaching(options => { // 全局配置所有请求按所有查询参数区分缓存 options.VaryByQueryKeys = new[] { "*" }; }); services.AddControllers(); }
之后在Configure方法中按正确顺序注册响应缓存中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件比如异常处理、静态文件等... app.UseRouting(); // 响应缓存中间件必须放在UseRouting之后,UseAuthorization之前 app.UseResponseCaching(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
方式2:注册MVC全局过滤器(等效于给所有控制器加特性)
如果你需要和控制器层面的[ResponseCache]特性逻辑保持一致,也可以通过全局过滤器实现:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(options => { // 全局添加ResponseCache过滤器,配置和控制器端特性参数一致 options.Filters.Add(new ResponseCacheAttribute { VaryByQueryKeys = new[] { "*" }, // 可按需添加其他参数比如 Duration = 60 等 }); }); // 仍需正常注册响应缓存服务 services.AddResponseCaching(); }
Configure方法的中间件注册顺序和方式1保持一致即可。
注意事项
如果同时配置了中间件全局参数和控制器端特性,控制器端的特性参数会覆盖全局配置的对应项。
内容的提问来源于stack exchange,提问作者jigar prajapati
相关产品推荐
相关产品推荐

