C# Minimal API: 응답 캐싱
Source: Dev.to
응답 캐싱
응답 캐싱은 클라이언트나 프록시가 웹 서버에 보내는 요청 수를 줄여줍니다. 또한 웹 서버가 응답을 생성하기 위해 수행해야 하는 작업량도 감소시킵니다. 응답 캐싱은 헤더에 설정됩니다. (Microsoft Docs)
응답 캐싱은 Cache‑Control 헤더를 사용하여 구성되며, 이를 통해 응답을 클라이언트 또는 중간 경로(예: 프록시)에서 캐시할 수 있습니다.
Minimal API에서의 응답 캐싱
ASP.NET Core MVC에서는 일반적으로 ResponseCache 특성과 UseResponseCaching 미들웨어를 함께 사용하여 응답 캐싱을 구성하지만, 이는 순수히 MVC 개념에 해당합니다.
Minimal API에서는 요청이 처리된 후 Cache‑Control 헤더를 설정하는 endpoint filter를 추가함으로써 유사한 동작을 구현할 수 있습니다.
RouteHandlerBuilder 캐싱 확장
다음 확장 메서드는 Minimal API 엔드포인트에 응답 캐싱을 간단히 적용할 수 있는 방법을 제공합니다. 엔드포인트 필터는 엔드포인트가 요청을 처리한 뒤 실행되어 지정된 최대 연령(max age)과 함께 Cache‑Control 헤더를 설정합니다.
public static class HttpResponseCachingConfiguration
{
private const int TenMinutes = 60 * 10;
private const int Hour = 60 * 60;
public static RouteHandlerBuilder AddResponseCacheTenMinutesHeader(this RouteHandlerBuilder routeHandlerBuilder)
=> routeHandlerBuilder.AddResponseCacheHeader(TenMinutes);
public static RouteHandlerBuilder AddResponseCacheHourHeader(this RouteHandlerBuilder routeHandlerBuilder)
=> routeHandlerBuilder.AddResponseCacheHeader(Hour);
public static RouteHandlerBuilder AddResponseCacheHeader(this RouteHandlerBuilder routeHandlerBuilder, int maxAgeInSeconds)
=> routeHandlerBuilder.AddEndpointFilter(async (context, next) =>
{
if (context.HttpContext.Response.StatusCode == StatusCodes.Status200OK)
{
context.HttpContext.Response.Headers.CacheControl = $"public,max-age={maxAgeInSeconds}";
}
return await next(context);
});
}
확장 사용 예시
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
})
.AddResponseCacheHourHeader()
.WithName("GetWeatherForecast");
Note: 브라우저나 프록시에서 클라이언트‑사이드 캐싱을 사용하려면 캐싱이 활성화되어 있어야 합니다. 한 번 캐시되면, 클라이언트 또는 프록시는 적절한 경우 자동으로 캐시된 응답을 제공합니다.
Important: 인증이 필요하거나 사용자별로 다른 데이터를 반환하는 엔드포인트에 대해 공개 응답 캐싱을 사용하지 마세요.
사용 시점
응답이 정적이고, 공개이며, 브라우저나 프록시가 안전하게 캐시할 수 있는 경우에 응답 캐싱을 사용합니다.