Фон
Я разрабатываю функцию изменения размера / кэширования изображений для веб-сайта - с использованием ASP.Net Core MVC 2.0
Как это должно работать
Клиент отправляетОбратитесь к /images/‹idid.jpg?height=100&width=100
- Получите оригинальное изображение
- Измените его размер до 100x100
- Сохраните его локально надиск, поэтому будущий запрос к тому же идентификатору / размеру подается непосредственно из локального хранилища, а не каждый раз изменяется.
Рабочий код
У меня есть этот метод на контроллере, который возвращаетлокальный образ:
[Route("(images/{id}.jpg")]
public IActionResult AwesomeImage(int id, int height, int width)
{
//Logic to check if a resized version exists on disk, resize it etc
//Not relevant for this question
string webRoot = _env.ContentRootPath;
var file = System.IO.Path.Combine(webRoot, $"resizedimage{id}.jpg");
return File(file, "image/jpeg");
}
Кэшировать его с помощью перезаписи URL - как?
Вместо проверки локального диска в приведенном выше коде и выдачи его в виде файла, я хотел быпросто URL переписать запрос к imageid / size для фактического файла - так как это будет намного быстрее, потому что не требует никакой обработки (я полагаю).
Вопрос
Как я могув этом случае динамически добавляется перезапись URL, будущие запросы к тому же URL будутполучить локальное изображение с помощью перезаписи URL.
Будущие запросы к тому же изображению / размеру даже не затронут этот метод действия
Примерно такой псевдокод:
[Route("(images/{id}.jpg")]
public IActionResult AwesomeImage(int id, int height, int width)
{
string webRoot = _env.ContentRootPath;
var file = System.IO.Path.Combine(webRoot, $"resizedimage{id}.jpg");
//Pseudocode:
UrlRewriter($"images/{id}.jpg?height={height}&width={width}", "/resizedimage{id}.jpg")
return File(file, "image/jpeg");
}