Проблема связи между доменами приложений

Я разрабатываю службу Windows на C #.

При запуске этой службы предоставляется набор путей к файлам конфигурации. Для каждого из этих файлов служба запустит AppDomain , используя файл в качестве своего ConfigurationFile и папку этого файла в качестве ApplicationBase . В каждой папке будет папка bin, заданная как PrivateBinPath .

Папка bin в этих папках содержит небольшую сборку, которая используется совместно со службой, эта сборка содержит интерфейс IServiceHost . Также известно имя типа и имя сборки класса, реализующего интерфейс IServiceHost .

Весь метод CreateServiceHost выглядит следующим образом: -

    public static IServiceHost CreateServiceHost(string configPath, string entryAssembly, string entryType)
    {
        IServiceHost host;

        AppDomainSetup setupInfo = new AppDomainSetup();
        setupInfo.ApplicationBase = Path.GetDirectoryName(configPath);
        setupInfo.PrivateBinPath = Path.Combine(setupInfo.ApplicationBase, "bin");
        setupInfo.ShadowCopyFiles = "true";
        setupInfo.ConfigurationFile = configPath;

        AppDomain appDomain = AppDomain.CreateDomain("Service for: " + setupInfo.ApplicationBase, AppDomain.CurrentDomain.Evidence, setupInfo);


        object objHost = appDomain.CreateInstanceFromAndUnwrap(Path.Combine(setupInfo.PrivateBinPath, entryAssembly), entryType);
        host = (IServiceHost)objHost;

        return host;
    }

IServiceHost интерфейс невероятно сложен: -

public interface IServiceHost
{
    void Start();
    void Stop();
}

Сервис OnStart содержит что-то вроде этого: -

private List<IServiceHost> serviceHosts = new List<IServiceHost>();

protected override void OnStart(string[] args)
{
    foreach (string configPaths in GetConfigPaths())
    {
        IServiceHost host = ServiceHostLoader.CreateServiceHost(configPath);
        serviceHosts.Add(host);
        host.Start();
    }
}

OnStop столь же прост (пока что для простоты, IServiceHost.Stop блокируют вызовы).

protected override void OnStop()
{
    foreach (IServiceHost host in serviceHosts)
    {
        host.Stop();
    }
}

Все это достаточно просто и прекрасно работает при тестировании на машинах разработки. Однако в QA я получаю исключения, когда он останавливается. Когда в разработке мы раскручиваем вещи только на короткий период, кажется, что все работает нормально. Однако в QA служба останавливается только каждые 24 часа. В этом случае он постоянно не останавливается правильно.

Вот пример того, что попадает в журнал событий: -

Тип события: Событие ошибки Когда в разработке мы раскручиваем вещи только на короткий период, кажется, что все работает нормально. Однако в QA служба останавливается только каждые 24 часа. В этом случае он постоянно не останавливается правильно.

Вот пример того, что попадает в журнал событий: -

Тип события: Событие ошибки Когда в разработке мы раскручиваем вещи только на короткий период, кажется, что все работает нормально. Однако в QA служба останавливается только каждые 24 часа. В этом случае он постоянно не останавливается правильно.

Вот пример того, что попадает в журнал событий: -

Тип события: Событие ошибки Источник: событие Workspace Services Категория: Нет Код события: 0 Дата: 11.03.2011 Время: 08:00:00 Пользователь: н / д Компьютер: QA-IIS-01 Описание: Не удалось остановить службу. System.Runtime.Remoting.RemotingException: Объект '/50e76ee1_3f40_40a1_9311_1256a0375f7d/msjxeib0oy+s0sog1mkeikjd_2.rem' был отключен или нет существуют на сервере.

Трассировка стека сервера: в System.Runtime.Remoting.Channels.ChannelServices.CheckDisconnectedOrCreateWellKnownObject (IMessage msg) в System.Runtime.Remoting.Channels.ChannelServices.SyncDispatchMessage (IMessage msg)

Исключение повторно генерируется в [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, тип Int32) в MyOrg.Service.IServiceHost.Stop () в MyOrg.Workspace.Service.MyAppService.OnStop () в System.ServiceProcess.ServiceBase.DeferredStop ()

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

13
задан AnthonyWJones 11 March 2011 в 16:53
поделиться