IIS 6/7 блокирует файлы изображений, пока они обслуживаются?
Я пишу фрагмент кода.NET, который должен перезаписывать файлы изображений на веб-сайте, размещенном на IIS 6 или 7. Единственными процессами, которые должны касаться изображений, являются IIS и мой процесс, который перезаписывает изображение.
Мне интересно, будет ли IIS блокировать файлы вообще, в результате чего мой перезаписывающий код вызовет исключение.
5 ответов
Короткий ответ будет состоять в том, чтобы попытаться открыть файл, если не удалось, подождать несколько секунд и повторить попытку, выполнить цикл до успеха или тайм-аута.
Однако, если вы часто обновляете эти образы, вы действительно побеждаете механизмы кэширования IIS. И для веб-сервера нецелесообразно обслуживать файлы, которые постоянно меняются. Веб-серверы хороши в обслуживании статических файлов.
Теперь, если ваши изображения настолько динамичны, возможно, вам придется использовать их через серверную программу. Создайте свои изображения (или прочитайте их из другой программы с помощью удаленного взаимодействия или WCF) и обслуживайте их. Ваша серверная программа также может выполнять некоторую форму кеширования. Нет необходимости даже сохранять файл изображения, если он длится очень короткое время.
Если вам нужно лишь периодически заменять эти изображения, то можно продолжать повторную попытку.
Теперь, если эти изображения действительно важны, и вы действительно хотите, чтобы IIS прекратил обслуживать старую версию, как только у вас появится новая версия (вы обслуживаете CAPTCHA?), И IIS обслуживает один и тот же файл много раз в секунду, тогда ваш процесс может оказаться не в состоянии найти слот. Тогда вам также нужно будет найти способ сказать IIS остановить и ждать новую версию - перезапуск должен работать, так как вы не часто меняете изображения (в противном случае вы бы пошли с динамическим маршрутом).
Несмотря на то, что IIS может заблокировать файл при чтении, вы можете переименовать файл и заменить его новой версией. Эта стратегия также может быть использована для решения проблемы "наполовину записанного файла", когда файл начинает считываться до того, как он полностью записан.
- Создать файл замены с временным именем файла
- Переименовать существующий файл из пути
- Переименуйте файл замены на свое место (для новых процессов, чтобы забрать)
- Удалить старый файл, когда сняты блокировки
Это возможно, учитывая, что во время чтения любого файла он блокируется во время чтения, поэтому вы можете столкнуться с ситуацией, когда IIS читает и обслуживает файл, и вы пытаетесь одновременно выполнить запись в файл.,
Это может помочь в ожидании файла, а затем в его блокировке. Имейте в виду, что IIS может реагировать медленнее, так как он также ожидает файл.
IIS заблокирует файлы.
Как насчет написания HttpHandler для изображений, чтобы иметь прямой контроль над тем, как изображения и откуда.
Поскольку вы затем управляете тем, как обрабатываются изображения и как их заменяют, все, что вам нужно разработать, - это общий механизм блокировки для поддержания порядка.
Предоставляя средства, я предполагаю, что они читают файлы и доставляют клиентам (браузеру). Для этой операции нет необходимости блокировать файл. Таким образом, мы можем предположить, что он открывает файл в режиме чтения. IIS использует API TransmitFile () для отправки файлов через сокеты. Он использует внутренний кэш ОС для производительности и не должен блокировать файл.
мы можем посмотреть, какой файл открывается каким процессом, используя processsexplorer из sysinternals. Это поможет вам определить, действительно ли он был открыт любым другим процессом.