iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
1
Modern Web

我與 ASP.NET Core 的 30天系列 第 24

[Day24] Response快取 - 我與 ASP.NET Core 3 的 30天

  • 分享至 

  • xImage
  •  

回應快取可減少用戶端或 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中使用Response快取

在Middleware中使用Response快取

在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的快取:

  • Cache-Control:最多可以快取10秒的Response。
  • Vary:只有在後續Request的接受編碼Header符合原始Request的接受編碼Header時,才會將Middleware設定為提供快取Response。

ResponseCaching Middleware只會快取 Http 200 狀態碼的伺服器回應。

在Action中使用Response快取

[HttpGet("")]
[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public ActionResult Get()
{
    ...
}

只有在設定VaryByHeader屬性時,才會寫入此Header。屬性設定為 Vary 屬性的值。
設定完畢之後可以透過瀏覽器存取網站,並查看Network的Header
Cache-Control: public,max-age=30
Vary: User-Agent

Respose快取的選項

  • MaximumBodySize
    Response主體的最大可快取大小(以位元組為單位)。預設值為 64 * 1024 * 1024 (64 MB) 。
  • SizeLimit
    Response快取Middleware的大小限制(以位元組為單位)。預設值為 100 * 1024 * 1024 (100 MB) 。
  • UseCaseSensitivePaths
    判斷是否要在區分大小寫的路徑上快取Response。預設值是false。

下列範例示範對Response快取作設定,在Startup.Configure在註冊服務的時候加入設定

services.AddResponseCaching(options =>
{
    options.MaximumBodySize = 1024;
    options.SizeLimit = 1024;
    options.UseCaseSensitivePaths = true;
});

參考資料
Response caching in ASP.NET Core


上一篇
[Day23] 本機快取與Redis快取 - 我與 ASP.NET Core 3 的 30天
下一篇
[Day25] SignalR - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言