回應快取可減少用戶端或 proxy 對 web server發出的Request數量。 Response快取也會減少 web Server產生Response所執行的工作量。Response快取是由Header控制,這些Header會指定您希望用戶端、proxy 和Middleware快取Response的方式。
ResponseCache 屬性會參與設定Response快取Header。 用戶端和中繼 proxy 應接受在 HTTP 1.1快取規格下快取回應的標頭。
若為遵循 HTTP 1.1 快取規格的伺服器端快取,請使用回應快取Middleware。Middleware 可以使用 ResponseCacheAttribute 來影響伺服器端快取行為。
在ASP.NET Core可以從Middleware中設定Response快取,Middleware會決定何時可快取Response、儲存Response,以及提供快取的Response。
首先要在Startup.ConfigureServices
中註冊ResponseCache
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddControllers();
}
接著在Startup.Configure
加入ResponseCaching,來新增 Middleware 的 pipeline。(要將UseResponseCaching
放在Cors的Middleware後面)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors();
app.UseResponseCaching();
app.Use(async (context, next) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(10)
};
context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] =
new string[] { "Accept-Encoding" };
await next();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
上方範例會新增Header,以控制後續Request的快取:
ResponseCaching Middleware只會快取 Http 200 狀態碼的伺服器回應。
[HttpGet("")]
[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public ActionResult Get()
{
...
}
只有在設定VaryByHeader屬性時,才會寫入此Header。屬性設定為 Vary 屬性的值。
設定完畢之後可以透過瀏覽器存取網站,並查看Network的Header
Cache-Control: public,max-age=30
Vary: User-Agent
下列範例示範對Response快取作設定,在Startup.Configure
在註冊服務的時候加入設定
services.AddResponseCaching(options =>
{
options.MaximumBodySize = 1024;
options.SizeLimit = 1024;
options.UseCaseSensitivePaths = true;
});
參考資料
Response caching in ASP.NET Core