Как вернуть разные заголовки управления кешем для разных конечных точек, используя минимальные API-интерфейсы ASP.NET?

Я хотел бы вернуть другое значение заголовка управления кешем для разных конечных точек, используя минимальные API-интерфейсы ASP.NET. Как это сделать без контроллеров?

Это может быть выполнено с помощью контроллеров следующим образом:

      using Microsoft.AspNetCore.Mvc;

namespace CacheTest;

[ApiController]
public class TestController : ControllerBase
{
    [HttpGet, Route("cache"), ResponseCache(Duration = 3600)]
    public ActionResult GetCache() => Ok("cache");

    [HttpGet, Route("nocache"), ResponseCache(Location = ResponseCacheLocation.None, Duration = 0)]
    public ActionResult GetNoCache() => Ok("no cache");
}

Первая конечная точка возвращает заголовок Cache-Control: public,max-age=3600.

Вторая конечная точка возвращает заголовок Cache-Control: no-cache,max-age=0.

1 ответ

Вы можете использоватьRequestDelegateперегрузка , которая позволяет вам взаимодействовать с HttpContextа также HttpResponseтак что вы можете установить заголовки кеша, например:

      app.MapGet("/", httpContext =>  
{
    httpContext.Response.Headers[HeaderNames.CacheControl] =
        "public,max-age=" + 3600;
    return Task.FromResult("Hello World!");
});

Вы можете написать простой метод расширения, чтобы добавить это для вас, например

      public static class HttpResponseExtensions
{
    public static void AddCache(this HttpResponse response, int seconds)
    {
        response.Headers[HeaderNames.CacheControl] =
            "public,max-age=" + 10000;
    }

    public static void DontCache(this HttpResponse response)
    {
        response.Headers[HeaderNames.CacheControl] = "no-cache";
    }
}

... что делает ваш минимальный метод API менее подробным:

      app.MapGet("/", httpContext =>  
{
    httpContext.Response.AddCache(3600);
    // or
    httpContext.Response.DontCache();

    return Task.FromResult("Hello World!");
});
Другие вопросы по тегам