Используя что-то вроде галочек, работа будет выполнена, но очень наивно. Вы будете больше напрягаться как на своем сервере, так и на клиентах, поскольку фактически изображение придется обновлять каждый раз, независимо от того, изменилось оно или нет. Если у вас есть мобильные пользователи, ситуация для них гораздо хуже, так как они будут вынуждены перезагружать все эти ресурсы снова и снова, обычно по ограниченным (и дорогостоящим) тарифным планам.
Гораздо лучший подход - использовать криптографический дайджест, часто называемый "хэш". По сути, одни и те же данные, зашифрованные одинаковым образом, будут возвращать тот же хеш Обычно он используется для обнаружения несанкционированного доступа к передаваемым данным, но поскольку каждое сообщение (как правило) будет иметь уникальный хэш, и этот хэш будет одинаковым каждый раз для одного и того же фрагмента данных, вы также можете использовать его для создания запроса очистки кэша строка, которая изменяется только при изменении самих данных изображения.
Теперь, если быть точным, технически нет гарантии, что два сообщения не приведут к одному и тому же хешу. Случаи, где это происходит, называются «столкновениями», и они могут произойти. Однако, если вы используете достаточно сложный алгоритм, такой как SHA256, вероятность столкновений значительно снижается. Несмотря на это, это не должно быть серьезной проблемой для этого конкретного случая использования изображений с кешем.
Проще говоря, чтобы создать хеш, вы просто делаете что-то вроде:
string hash;
using (var sha256 = SHA256.Create())
{
hash = Convert.ToBase64String(sha256.ComputeHash(imageBytes));
}
Тогда значение hash
будет примерно таким: z1JZs/EwmDGW97RuXtRDjlt277kH+11EEBHtkbVsUhE=
.
Однако в ASP.NET Core есть встроенный ImageTagHelper
, который с этим справится. По сути, вам просто нужно сделать:
<img src="/path/to/image.jpg" asp-append-version="true" />
Что касается вашего второго вопроса, о сокрытии или запутывании пути к изображению, то это не совсем возможно, но можно обойти. URL, который вы используете для ссылки на изображение, однозначно идентифицирует этот ресурс. Если вы измените его каким-либо образом, он больше не будет тем же ресурсом, и, следовательно, не найдет фактическое изображение, которое вы хотите отобразить. Таким образом, в строгом смысле, нет, вы не можете изменить URL. Однако вы можете прокси-запрос через другой URL, фактически запутывая URL для исходного изображения.
Проще говоря, вы просто выполняете действие на каком-либо контроллере, который принимает путь к изображению (как часть строки запроса), загружает его из файловой системы и возвращает его в качестве ответа. Следует позаботиться об ограничении области действия файлов, которые могут быть возвращены подобным образом, как на основе каталога (разрешить только каталог изображений, например, не C:\Windows\
и т. Д.), Так и типа файла (разрешать возврат только изображений, но не случайные текстовые файлы, файлы конфигурации и т. д.). Эта часть достаточно проста, и вы можете найти много примеров в Интернете, если они вам нужны.
В конечном счете, это на самом деле ничего не решает, потому что теперь ваш путь к изображению находится просто в строке запроса. Однако теперь, когда вы настроили эту часть, вы можете зашифровать эту часть строки запроса с помощью API защиты данных. В docs имеется некоторая базовая информация по началу работы. По сути, вы просто собираетесь зашифровать путь к изображению при создании URL, а затем в своем действии, которое возвращает изображение, вы сначала расшифровываете путь перед запуском остальной части кода. Для части шифрования вы можете создать помощник по тегам , чтобы сделать это для вас, не имея тонны логики в ваших представлениях.