Как кэшировать ответ IFileProvider для всех пользователей в ASP. NET Базовом приложении? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть ASP. NET Core 3.1 WebAPI, который обслуживает другие приложения с изображениями. Входящий запрос может определять максимальную высоту изображения, используя строку запроса.

Так что, если приложение хочет конкретное c изображение с максимальной шириной 200 пикселей, запрос будет https://example.com/images/blue_skye.jpg?maxwidth=200, и если приложение хочет изображение в оригинальном размере, тогда запрос будет https://example.com/images/blue_skye.jpg.

. Мой WebApi создает изображения разных размеров на лету для каждого запроса. Я хочу иметь возможность кэшировать ответ сервера в памяти или на диск, чтобы не создавать заново изображения.

Вот как настроено мое промежуточное ПО FileProvider

app.UseStaticCustomFiles(new StaticCustomFileOptions()
{
    FileProvider = new ImageProvider("app root", imageProcessor),
    RequestPath = new PathString("/images"),
});

Я могу установить OnPrepareResponse свойство, устанавливающее значения элемента управления кэшем, например, так:

app.UseStaticCustomFiles(new StaticCustomFileOptions()
{
    FileProvider = new ImageProvider("app root", imageProcessor),
    RequestPath = new PathString("/images"),
    OnPrepareResponse = ctx =>
    {
        const int durationInSeconds = 3600 * 24 * 15;
        ctx.Context.Response.Headers[HeaderNames.CacheControl] = "public,max-age=" + durationInSeconds;
    }
});

Но я думаю, что это частный элемент управления кэшем, который означает, что он будет кэшировать его по запросу и не будет использоваться совместно с другими приложениями.

Как настроить общий кэш, чтобы, если несколько пользователей запросили https://example.com/images/blue_skye.jpg?maxwidth=200, сервер создавал изображения с разрешением 200 пикселей и кэшировал их для всех будущих запросов от других пользователей / приложений?

...