Как разделить семафор между 2 процессами IIS w3wp.exe - PullRequest
0 голосов
/ 21 октября 2019

Как создать семафор, доступный через 2 отдельных процесса w3wp.exe в Azure. Проблема в Azure заключается в том, что при добавлении нового элемента конфигурации приложения Azure перезапускает мой веб-сайт на новом процессе w3wp.exe, который выполняется одновременно со старым процессом w3wp.exe во время его закрытия. Я использую семафор для синхронизации между 2. Это работало до сих пор, т.е. на локальном IIS - изменения конфигурации обычно просто запускают новый домен приложения, но в Azure запускается новый процесс w3wp.exe. И этот новый процесс не распознает существующий именованный семафор.

Следующий код всегда указывает, что семафор не существует. Даже когда я создаю отдельное консольное приложение и создаю семафор, я все равно получаю, что его нет в моем веб-приложении. Кажется, что в IIS в Azure существует пространство имен для семафоров. Я видел еще одну статью о ранней версии IIS, в которой семафоры глобально распределялись между процессами только в том случае, если в качестве префикса имени использовался «Global \» - это не работает в Azure, и я не могу выяснить, что такое «глобальное» пространство имендолжно быть - есть идеи?

К вашему сведению - если я запускаю консольное приложение - 2 экземпляра - что оба получают доступ к одному семафору, они оба могут его видеть. Но 2 процесса, выполняющихся в IIS в Azure, не могут.

try
{
    // Open the semaphore 
    //
    _semaphore2 = Semaphore.OpenExisting(name);
    doesNotExist = false;
}
catch (WaitHandleCannotBeOpenedException)
{
    _logger.Info<MainDom>("Semaphore ({name}) does not exist", name);
    doesNotExist = true;
}

Ответы [ 2 ]

1 голос
/ 21 октября 2019

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

Для локального IIS измените расширенные свойства пула приложений и настройте Отключить перекрывающуюся перезапуск и / или Отключите переработку для изменений конфигурации вариантов. Я полагаю, что последний доступен только в IIS 10 +.

Configure Applcation Pool

Процесс для Azure немного сложнее. Это включает в себя обновление applicationHost.config, для которого вам нужно использовать Kudu. См. этот поток для получения подробных инструкций.

По сути, это включает в себя создание файла XDT (преобразование) для обновления файла конфигурации. Можно найти пример:

https://github.com/projectkudu/kudu/wiki/Xdt-transform-samples#remove-all-your-recycling-options-from-your-net-4-application-pool-and-make-it-available-always

Редактировать:

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

<add name="yourAppPoolNameHere" autoStart="true" managedRuntimeVersion="v4.0">
    <processModel shutdownTimeLimit="00:00:01" />

Слово предостережения, приведенное выше приведёт к тому, что svchost.exe через 1 секунду прекратит процесс w3wp.exe без каких-либо льгот.

0 голосов
/ 23 октября 2019

Это обходной путь - не ответ - но размещение его здесь в случае, если это поможет другим - поскольку оно скрыто в одном из моих комментариев, который по умолчанию скрыт.

Установка WEBSITE_DISABLE_OVERLAPPED_RECYCLING на 1 в AzureНастройки приложения работали с точки зрения сериализации процессов w3wp, то есть один полностью отключился бы до запуска другого - в моем случае это избавило от необходимости в семафоре. Я все еще хотел бы ответить на оригинальный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...