Заменить библиотеку службы WCF без перезапуска службы - PullRequest
6 голосов
/ 24 июня 2011

У меня есть служба WCF, размещенная в службе Windows, и у меня есть 2 сборки: узел (.exe) и библиотека служб (.dll). Когда библиотека сервиса обновляется, мы должны остановить сервис, чтобы можно было заменить библиотеку. Я хотел бы иметь аналогичные функции IIS, например, заменить библиотеку без перезапуска службы. Возможно ли это и как?

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

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

РЕДАКТИРОВАТЬ

(1) Чтобы запустить ServiceHost с использованием класса в определенномбиблиотека типов, вам придется использовать отражение.Примерно так:

Assembly myAssembly = Assembly.LoadFile(path);

Type serviceType = myAssembly.GetType(className);

ServiceHost serviceHost = new ServiceHost(serviceType);

Из документации не ясно, как LoadFile разрешает зависимости.Возможно, вам придется подключить событие Assembly.ModuleResolve, чтобы эта работа работала.

(2) Мониторы файловой системы, безусловно, требуют некоторых затрат, но, по моему опыту, они минимальны.В любом случае, это действительно единственный вариант, если вы не хотите использовать установщик для обновленных DLL.

(3) Я не знаю, почему ваш файл заблокирован.Вам придется устранить это самостоятельно.

2 голосов
/ 24 июня 2011

У Петра есть одно предложение. В зависимости от размера и от того, можете ли вы это сделать, можно перенести инфраструктуру как минимум на 2 кластерных сервера. Это позволяет вам обновлять по одному, в то время как другие продолжают принимать запросы. При правильной версии (изменения контракта == новый метод) эта методология работает хорошо, так как старые клиенты продолжают получать одни и те же данные независимо от ваших новых битов.

...