Во время наших производственных сборок очень большой (10 мегабайт) файл статического содержимого в корневом каталоге иногда блокируется IIS и не может быть удален чистой задачей. Вероятно, это связано с тем, что в данный момент он активно обслуживается одним или несколькими клиентами.
Процесс сборки останавливает сайт перед очисткой через
c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
Однако это не освобождает файл - мы должны перезапустить IIS, чтобы процесс снял свою блокировку.
appcmd.exe
позволяет полностью отключить IIS; мы не хотим этого делать!
Существуют ли другие способы заставить IIS освободить заблокированный файл без перезапуска IIS? Простая остановка и запуск отдельного сайта определенно не работает, чтобы снять блокировку файла.
Ответы:
Существуют инструменты, такие как Process Explorer в Sysinternal, которые могут находить и принудительно закрывать дескрипторы файлов, однако состояние и поведение приложения (как вашего, так и, в данном случае, IIS) после этого не определено. Некоторых это не волнует, некоторые будут ошибаться, а другие будут сильно падать.
Правильное решение состоит в том, чтобы отключить систему и позволить IIS аккуратно снять блокировки и очистить после себя, чтобы сохранить стабильность сервера. Если это невозможно, вы можете либо создать другой сайт в том же блоке, либо создать новый блок с новым контентом и переместить доменное имя / IP-адрес для «продвижения» нового контента в производство.
источник
Я использую небольшой инструмент под названием «Ручка», чтобы сделать это.
Вы в основном передаете ему имя файла, который заблокирован, и он сообщает вам, какие процессы его используют:
Затем вы передаете ему ключ -c, чтобы он закрывал дескриптор:
Вы можете изо всех сил работать над этим в сценарии сборки без программы-обертки для анализа вывода, но, надеюсь, это поможет.
источник
Я не уверен, если вы имеете в виду компиляцию файлов aspx во временных сборках. Мы используем проекты развертывания ASP.NET , которые предварительно компилируют все файлы aspx / ascx.
При копировании двоичных файлов из папки «publish» в папку «bin» мы временно включаем файл app_offline.htm, который удаляется после копирования всех сборок (всего несколько секунд). Таким образом, я никогда не сталкивался с блокировками файлов.
РЕДАКТИРОВАТЬ:
Вы можете попытаться перезапустить пул приложений, используя appcmd.exe, вместо остановки веб-сайта:
источник
Я пытаюсь это сейчас: очевидно, могут быть проблемы с блокировкой файлов, если у вас активирована индексация в каталоге. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html
Это IIS 6.0, но поскольку это, похоже, связано с ОС, а не с IIS, это может быть основной причиной.
источник
Process Monitor должен помочь вам с вашим расследования, вот пример из блога Марка ( на парня , который написал инструмент) о том , как найти дескриптор файла.
Вы можете попробовать этот инструмент Unlocker для автоматизации разблокировки на уровне дескриптора файла.
источник
Не ответ, а обходной вариант, если нет способа «разблокировать» этот файл без перезапуска сервера IIS:
Что если вы соберете / развернете новую пустую папку и измените домашнюю папку веб-сайта на эту папку? Вы должны создать новое имя папки или переключаться между двумя именами.
Я не знаю, к какой папке принадлежит этот файл. Если он не должен находиться в корневой папке, вы можете поместить его во вновь созданную папку и создать виртуальный каталог, указывающий на эту папку. Таким образом, вы можете сохранить свой стандартный домашний каталог для приложения.
источник
У меня такая же проблема. Теперь я переключился на MSDeploy (Web Deploy) , и теперь я могу надежно обновлять веб-сайт, ничего не останавливая. На самом деле этот шаг написан на скрипте в нашем автоматизированном инструменте сборки, и это происходит постоянно без проблем. И это тоже быстро.
источник
Конечно, остановите службу IIS. Может я чего-то не понимаю, извините.
источник
примечание: не эксперт по семантике блокировки файлов Windows
Джаррод, вы можете переименовать файл с пути. Вы также можете создать новый файл с временным расширением, а затем переименовать его поверх текущего файла.
Если семантика блокировки файлов Windows работает аналогично семантике POSIX, читатели, которые удерживают текущую блокировку чтения файла, должны продолжать обслуживать старый файл, пока они не закроют свои потоки чтения, пока новые читатели откроют новый файл.
источник