Настройте теневое копирование с помощью app.config - PullRequest
2 голосов
/ 30 сентября 2011

Позвольте мне сначала объяснить сценарий.

Я установил несколько копий (скажем, 10) Служб с одной установочной базы. Теперь я хочу обновить один из DLL. Мне нужно остановить все службы, обновить DLL и перезапустить службу снова.

Чтобы избежать ситуации, я использовал ShadowCopying в коде. Так что dll может быть обновлен без остановки всех сервисов. Это выглядит следующим образом.

static void Main(string[] args)
{
    AppDomain.CurrentDomain.SetCachePath(@"C:\Cache");
    AppDomain.CurrentDomain.SetShadowCopyPath(AppDomain.CurrentDomain.BaseDirectory);
    AppDomain.CurrentDomain.SetShadowCopyFiles();

    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] 
        { 
            new SampleService(serviceName) 
        };
    ServiceBase.Run(ServicesToRun);
}

Теперь я пытаюсь добиться того же с помощью файла app.config, как показано ниже, из Asp.Net

<hostingEnvironment 
    idleTimeout="Infinite" 
    shutdownTimeout="30" 
    shadowCopyBinAssemblies="true" />

Есть предложения?

1 Ответ

2 голосов
/ 30 сентября 2011

В хостинговой среде ASP.Net встроена поддержка управления утилизацией приложений.

Службы Windows .Net используют стандартный хост CLR, который не имеет этой поддержки.Вам придется реализовать свой собственный, например,

  1. Создать дочерний элемент AppDomain для размещения своего служебного кода и настроить теневое копирование.
  2. Используйте что-то вроде FileSystemWatcher для мониторингаисходный каталог bin.
  3. Когда файлы изменятся, снесите AppDomain, создайте новый и перезагрузите.

Хост ASP.Net что-то делает в этом направлении (но такжеимеет возможность управлять существующими запросами, ставить в очередь новые запросы, пока это происходит, и т. д.).

...