Как обнаружить проблему с сервисом .net, который напрямую переходит в состояние остановки без ошибок - PullRequest
2 голосов
/ 21 января 2009

У меня есть служба .Net, которая начала отказываться запускаться - системный журнал показывает, что она «успешно отправила элемент управления запуском», а затем через пять секунд «служба перешла в состояние остановки». У меня есть функция Main () моего класса обслуживания, завернутая в блок try / catch, но когда возникает такая ситуация, в моем журнале событий не появляются ошибки из моего сервиса.

Я хотел бы знать, в чем проблема. Если есть какое-то исключение, которое не было поймано - где оно будет поймано? Ниже приведен код, в котором я запускаю сервис.

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace MyServerService
{
    static class service
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            try
                {
#if DEBUG

                    System.Diagnostics.Debugger.Launch();

#endif

                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[] 
                { 
                    new MyService() 
                };
                    ServiceBase.Run(ServicesToRun);
            } catch (Exception ex)
            {
                System.Diagnostics.EventLog.WriteEntry("MyServerService", "Main() Error: " + ex.Message + ex.InnerException, System.Diagnostics.EventLogEntryType.Error);
            }
        }
    }
}

Ответы [ 5 ]

1 голос
/ 08 февраля 2009

В этой ситуации я записывал в журнал приложений Windows - в производственной среде журнал был заполнен. Я не уверен, какой должна быть техника отладки, чтобы «поймать» этот класс проблемы - но это была проблема для нас.

1 голос
/ 21 января 2009

Что делает ваша реализация ServiceBase.OnStart ? Если он не вернется в течение установленного периода времени, диспетчер управления службами снова остановит службу. В идеале вы должны создать новый поток в методе OnStart для любой необходимой обработки и вернуть как можно скорее.

1 голос
/ 21 января 2009

Метод Run не собирается бросать здесь. Скорее, вам нужно обернуть код в перегрузку метода OnStart класса MyService в блок try / catch, поскольку именно здесь происходит исключение.

0 голосов
/ 21 января 2009

Вы можете добавить обработчик в AppDomain.Current.UnhandledException и поместить некоторый код регистрации в обработчик исключений. Это позволит вам поймать любое исключение, которое вызывает остановку службы.

В VB.NET это будет выглядеть примерно так

Sub Main(ByVal ParamArray parameters As String())
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomainExceptionHandler

...

End Sub

Private Sub AppDomainExceptionHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)

...

End Sub

не уверен, как это будет выглядеть в C #, так как мой C # -fu не очень хорош

0 голосов
/ 21 января 2009

Я бы проверил, все ли компоненты, на которые опирается служба, установлены правильно.

Используйте ildasm.exe или аналогичный инструмент, чтобы проверить, что ему нужно, и посмотреть, доступен ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...