Не удается запустить службу верхнего уровня локально: служба не ответила своевременно

У меня возникают трудности с запуском службы с использованием следующей настройки.

static void Main(string[] args)
{
    var builder = new ContainerBuilder();
    builder.RegisterModule<FixAcceptorModule>();
    var container = builder.Build();

    var rc = HostFactory.Run(c =>
    {
        c.UseAutofacContainer(container);
        c.Service<IServiceManager>(svc =>
        {
            svc.ConstructUsingAutofacContainer();
            svc.WhenStarted(sm => sm.Start()).BeforeStartingService(a => a.RequestAdditionalTime(TimeSpan.FromSeconds(30)));
            svc.WhenStopped(sm => sm.Stop());
        });

        c.SetDescription("");
        c.SetDisplayName("FIX Acceptor Service");
        c.SetServiceName("FixAcceptorSvc");

        c.RunAsLocalService();
        c.StartManually();
    });
}

Это результат запуска действия myservice.exe start:

Topshelf.Hosts.StartHost Error: 0 : The service failed to start., System.InvalidOperationException: Cannot start service FixAcceptorSvc on computer '.'. ---> System.ComponentModel.Win32Exception: The service did not respond to the start or control request in a timely fashion
   --- End of inner exception stack trace ---
   at System.ServiceProcess.ServiceController.Start(String[] args)
   at System.ServiceProcess.ServiceController.Start()
   at Topshelf.Runtime.Windows.WindowsHostEnvironment.StartService(String serviceName, TimeSpan startTimeOut)
   at Topshelf.Hosts.StartHost.Run()

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

На что следует обратить внимание:

  • Моя машина разработчика присоединена к домену и работает Windows 10 Pro - 1909
  • При запуске сервиса из Visual Studio 2019 в конфигурации отладки все работает отлично
  • myservice.exe install --localservicec.RunAsLocalSystem() в HostFactory) => тот же результат
  • myservice.exe install --localsystemc.RunAsLocalSystem() в HostFactory) => тот же результат
  • Также использование myservice.exe install -username myaduser -password myadpassword не помогло (двойная проверка групповых политик и того, что моему пользователю разрешен вход в систему в качестве службы)

Так что я делаю неправильно здесь?


person Matthias Güntert    schedule 04.06.2020    source источник
comment
Что происходит, когда вы его отлаживаете? Достигнут ли метод Start() или Stop()?   -  person Pavel Anikhouski    schedule 04.06.2020
comment
Спасибо за ответ. Дело в том, что он работает без проблем при отладке. Моя проблема была связана с путем поиска соответствующих файлов конфигурации.   -  person Matthias Güntert    schedule 04.06.2020


Ответы (1)


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

c.OnException(ex =>
{
    File.AppendAllText(@"C:\Temp\Service.txt", ex.ToString());
});

Теперь это наконец вывело меня на трассу. Как показывает исключение, что-то не так с моей службой, которая ищет словарь FIX не в той папке (C:\Windows\System32)... Проблема решена!

Topshelf.ServiceBuilderException: An exception occurred creating the service: IServiceManager ---> Autofac.Core.DependencyResolutionException: An exception was thrown while activating StrukiApp.FixAcceptor.Infrastructure.ServiceManager -> StrukiApp.FixAcceptor.Acceptor. ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(QuickFix.IApplication, QuickFix.IMessageStoreFactory, QuickFix.SessionSettings, QuickFix.ILogFactory)' on type 'Acceptor'. ---> QuickFix.ConfigError: Configuration failed: Could not find file 'C:\WINDOWS\system32\FIX44.xml'. ---> System.IO.FileNotFoundException: Could not find file 'C:\WINDOWS\system32\FIX44.xml'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at QuickFix.SessionFactory.createDataDictionary(SessionID sessionID, Dictionary settings, String settingsKey, String beginString)
   at QuickFix.SessionFactory.ProcessFixDataDictionary(SessionID sessionID, Dictionary settings, DataDictionaryProvider provider)
   at QuickFix.SessionFactory.Create(SessionID sessionID, Dictionary settings)
   at QuickFix.ThreadedSocketAcceptor.CreateSession(SessionID sessionID, Dictionary dict)
   at QuickFix.ThreadedSocketAcceptor.CreateSessions(SessionSettings settings, SessionFactory sessionFactory)
   at QuickFix.ThreadedSocketAcceptor..ctor(SessionFactory sessionFactory, SessionSettings settings)
person Matthias Güntert    schedule 04.06.2020
comment
Я получаю сообщение об ошибке, говорящее, что «HostConfigurator» не содержит определения для «OnException»... Пожалуйста, дайте мне знать, как вы смогли добавить это в свой код. - person Waldron; 24.04.2021