Я разрабатываю службу 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 ()
Дополнительные сведения см. В справке и Центр поддержки в или предложить лучший способ для домена по умолчанию аккуратно запрашивать завершение работы сгенерированных доменов?