Сбой веб-развертывания из-за используемого файла

Я использую службу Microsoft Web Deploy Remote Agent, которая позволяет мне легко публиковать код на сервере из Visual Studio.

Веб-сайт, который я развертываю, использует log4net для записи сообщений в файлы журнала, и каждый раз, когда я пытаюсь развернуть новую версию кода, я получаю эту ошибку в Visual Studio, указывающую, что текущий файл журнала log4net используется:

Произошла ошибка при обработке запроса на удаленном компьютере. Файл "Web.log" используется.

Процесс не может получить доступ к «C:\inetpub\wwwroot\Logs\Web.log», так как он используется другим процессом.

Я могу решить эту проблему, зайдя на сервер и выполнив iisreset перед публикацией... но это своего рода поражение точки "простой" публикации из Visual Studio :)

Есть ли способ заставить задачу публикации автоматически выдавать iisreset или как-то еще обойти это?


person Cocowalla    schedule 23.04.2013    source источник
comment
Это ваш файл журнала log4Net?   -  person Tommy    schedule 23.04.2013
comment
@Tommy Да, извините, я должен прояснить это :)   -  person Cocowalla    schedule 23.04.2013
comment
Мне интересно, можете ли вы связать событие Application_End в вашем файле global.asax и вызвать параметр выключения для log4Net. Это должно снять блокировку файла. Мне не приходилось этого делать, поэтому я не опубликовал ответ, но есть несколько вопросов SO и другие вопросы, связанные с отключением службы ведения журнала по различным другим причинам.   -  person Tommy    schedule 23.04.2013
comment
@ Томми Пробовал, но не получилось. Событие Application_End, похоже, не вызывается при публикации :(   -  person Cocowalla    schedule 24.04.2013


Ответы (2)


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

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

К вашему элементу <appender> в файле web.config? Из документов Apache

Открывает файл один раз для каждого цикла AcquireLock/ReleaseLock, удерживая таким образом блокировку на минимальное время. Этот метод блокировки значительно медленнее, чем FileAppender.ExclusiveLock, но позволяет другим процессам перемещать/удалять файл журнала, пока продолжается ведение журнала.

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

person Tommy    schedule 24.04.2013

Существует поставщик MSDEPLOY под названием recycleApp. который используется именно для этого. Вы можете включить это в свой манифест развертывания.

Другой вариант — использовать флаг ignoreOnErrors, который пропустит используемый файл и продолжит развертывание.

person Shaikh Owais    schedule 28.04.2013
comment
Можете ли вы дать некоторую информацию о recycleApp и о том, как его включить? Я не вижу никаких параметров в Visual Studio, то же самое для флага ignoreOnErrors - person Cocowalla; 29.04.2013
comment
Вы можете запустить эту команду вручную в качестве шага перед развертыванием или автоматически с помощью шага развертывания VS — проверьте AfterTargets="CopyAllFilesToSingleFolderForPackage". В VS еще нет опции, позволяющей перезапустить приложение — только файл + параметры публикации SQL. - person SliverNinja - MSFT; 20.03.2014