Новая версия приложения службы Windows не запускается

У меня работает служба Windows. Я создал новую версию приложения. Я пошел на сервер Windows и остановил службу. Затем я скопировал новый .exe для службы и попытался запустить службу. Служба не запускается, время попытки запуска истекает, и я не могу понять, почему. Я уверен, что делал это раньше. Мне нужно удалить службу и переустановить ее?

Сервер: Windows Server 2003 R2 Приложение .NET Версия: 2.0 Разработано с помощью: VS 2005 Язык VB.NET

Метод OnStart:

Protected Overrides Sub OnStart(ByVal args() As String)
    ' Add code here to start your service. This method should set things
    ' in motion so your service can do its work.
    Me.Timer1.Enabled = True
End Sub

InitializeComponent: CHECKDB_INTERVAL_TIME = 10

Private Sub InitializeComponent()
    Dim iWaitTime As Int16
    iWaitTime = CType(ConfigurationManager.AppSettings("CHECKDB_INTERVAL_TIME"), Int16)
    Me.components = New System.ComponentModel.Container
    Me.Timer1 = New System.Timers.Timer()
    Me.Timer1.Interval = iWaitTime * 60000
    '
    'HarleyCloser
    '
    Me.ServiceName = "MyService"

End Sub

Friend WithEvents Timer1 As System.Timers.Timer

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


person Adam    schedule 12.08.2011    source источник
comment
Есть сообщения об ошибках в средстве просмотра событий?   -  person iandotkelly    schedule 12.08.2011
comment
Что говорится в журнале приложений в Event Viewer?   -  person jgauffin    schedule 12.08.2011
comment
Если средство просмотра событий ничего не говорит, я нашел полезным добавить записи журнала событий или сообщения в базу данных во время отладки - такие вещи, как О вызове DoSomeWork ... и DoSomeWork Completed ... и т. Д., Особенно в циклах, содержащих процессы, выполнение которых может занять некоторое время. Это действительно единственный способ, который я придумал, чтобы легко отлаживать приложение службы. Это позволяет увидеть, где в коде служба зависает или работает дольше, чем ожидалось.   -  person David    schedule 12.08.2011
comment
Теперь, когда я сказал это, я просто подумал о поиске в Google способов отладки службы Windows, и, конечно же, у Microsoft есть потенциально лучший способ: msdn.microsoft.com/en-us/library/7a50syb3 (v = VS.80) .aspx   -  person David    schedule 12.08.2011
comment
@David Stratton Я думаю, у вас все еще есть только 30 секунд, чтобы выполнить код, прежде чем диспетчер службы завершит службу.   -  person Scott Chamberlain    schedule 12.08.2011
comment
По моему опыту, менеджер службы часто сообщает, что не может запустить службу, но служба продолжает запускаться. В частности, у меня есть одна служба, которая обрабатывает файлы на сервере и передает их в БД. Если он не работает более часа, ему нужно наверстать упущенное. В обязательном порядке я запущу службу, увижу сообщение об ошибке, в котором говорится, что невозможно запустить службу, но проверьте, файлы все еще обрабатываются и служба работает. Затем я возвращаюсь примерно через 20 минут, обновляю статус и вижу, что он запущен.   -  person David    schedule 12.08.2011
comment
Таким образом, я могу с уверенностью сказать, что служба должна по-прежнему работать, а отладчик должен иметь возможность подключаться, даже если диспетчер служб дал вам сообщение о невозможности запуска службы, ЕСЛИ что-то действительно вызывает сбой службы, например необработанный исключение. (В этом случае должен автоматически создаваться журнал событий.)   -  person David    schedule 12.08.2011
comment
@ Адам, вы можете опубликовать код, который вы использовали для настройки Timer1?   -  person Scott Chamberlain    schedule 12.08.2011
comment
Для чего установлен интервал таймера и, опять же, какой это тип таймера? Существует три типа: msdn.microsoft.com/en-us/magazine/cc164015 .aspx   -  person David    schedule 12.08.2011
comment
Таймер установлен как: Friend WithEvents Timer1 как System.Timers.Timer   -  person Adam    schedule 12.08.2011
comment
Я нашел проблему. В службе был скрыт код с директивой отладки. Если сервис был скомпилирован в Debug, то он работал как консольное приложение, если он был скомпилирован в Release, то он работал как сервис. Таким образом, время ожидания службы при OnStart истекло, потому что она пыталась запустить все консольное приложение.   -  person Adam    schedule 15.08.2011


Ответы (5)


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

person Paul Mitchell    schedule 12.08.2011

Вы должны использовать installutil, чтобы удалить старую службу, а затем снова установить новую. Вы можете использовать installutil через командную строку Visual Studio.

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

person Vladimir    schedule 12.08.2011

Остановка службы, замена exe и повторный запуск должны быть нормальными, я делал это много раз.

Что-то, что вы изменили между версиями, поставило задачу, которая занимает много времени в вашем OnStart. OnStart должен пройти от начала до конца менее чем за 30 секунд. Проверьте свой код OnStart на предмет блокировки.

Если вам нужно отлаживать OnStart , вот несколько советов о том, что делать, однако ограничение в 30 секунд по-прежнему действует. Еще один совет - добавить в OnStart несколько сообщений журнала, которые будут добавлять сообщения в журнал Windows, показывающие, как далеко продвинулся ваш код.

person Scott Chamberlain    schedule 12.08.2011
comment
Я использую таймер и включаю таймер в событии OnStart. Будет ли это возгорание и, возможно, вызвать тайм-аут, пока служба пытается запуститься? - person Adam; 12.08.2011
comment
Что за таймер, в .NET framework их несколько. Самое полезное, что вы можете сделать, - опубликовать весь метод OnStart в исходном вопросе в качестве редактирования. Просто вставьте его, выделите и нажмите кнопку { }, чтобы правильно отформатировать. - person Scott Chamberlain; 12.08.2011

Для установки и удаления необходимо использовать installutil. ВСЕГДА замена .EXE - не лучший подход.

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

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User; this.serviceProcessInstaller1.Password = ConfigurationSettings.AppSettings ["пароль"]; this.serviceProcessInstaller1.Username = ConfigurationSettings.AppSettings ["имя пользователя"];

person Luis Valencia    schedule 12.08.2011

Я нашел проблему. В службе был скрыт код с директивой отладки. Если сервис был скомпилирован в Debug, то он работал как консольное приложение, если он был скомпилирован в Release, то он работал как сервис. Таким образом, время ожидания службы при OnStart истекло, потому что она пыталась запустить все консольное приложение.

person Adam    schedule 15.08.2011