Служба Windows работает на Windows 7, но не на Windows Server 2003 - PullRequest
0 голосов
/ 09 июня 2011

Решенную проблему смотрите в нижней части моего поста.

Итак, у меня есть простая служба Windows, которая просматривает определенную папку и выгружает файлы, которые поступают в нее, на сервер с помощью веб-службы.

Он отлично работает на моей машине с Windows 7, но когда я пытаюсь запустить его на Windows Server 2003, я получаю сообщение об ошибке: Ошибка 1053: служба не отвечает на запрос запуска или управления своевременно. Но я получаю это сообщение через несколько секунд.

Я создал ServicesPipeTimeout и установил его на 60000 миллисекунд.

Я попытался запустить его из командной строки с помощью команды sc query и обнаружил, что WIN32_EXIT_CODE равен 0, что, я думаю, означает, что служба даже не пытается запустить, потому что она находит ошибку перед запуском.

В программе просмотра событий я получаю ошибки 7000 и 7009. Я администратор на сервере Windows. Единственное, что я не пробовал, это исправление, которое я нашел в Microsoft, но я не хочу его использовать, потому что, насколько я понимаю, это происходит, когда служба фактически перестает работать. http://support.microsoft.com/kb/886695

Я перепробовал все, что мог придумать, есть ли что-то, чего мне не хватает?

Гисли

РЕДАКТИРОВАТЬ: переустановить .NET Framework, и теперь я получаю новую ошибку, сказав, что контроллер службы не может быть найден.

РЕДАКТИРОВАТЬ: я настраиваю службу с проектом установки, не используя команду installutil. Это потому, что мне нужно получить пользовательский ввод во время установки и сохранить его в реестре.

РЕДАКТИРОВАТЬ: Я установил .NET 4.0 Framework, не удалось установить службу без этого.

В дополнение к тому, что я написал выше, я также попробовал: Rebooting. Повторная установка. Я попытался изменить права доступа к файлам, доступ к которым необходим службе. Изменение разрешений в редакторе реестра. Отредактировал код так, чтобы функция onStart запускала только один поток.

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

Решение: Оказалось две отдельные проблемы. Необходимо было исправить фреймворк .NET, и мне пришлось удалить предложение try / catch, которое было у меня при запуске сервиса. По какой-то причине (неизвестно мне) блок try catch сделал что-то, что сделало невозможным запуск службы в Windows Server 2003, но он нормально работал в Windows 7.

Было бы очень интересно узнать, почему это так.

Спасибо за помощь.

Gísli

Ответы [ 4 ]

1 голос
/ 09 июня 2011

Установили ли вы правильную версию .NET Framework на ПК с Server 2003? То, что входит в стандартную комплектацию Windows 7, необходимо установить вручную на более старую ОС.

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

EDIT: Попробуйте также Fusion Log Viewer . Установите для регистрации ошибок, затем запустите свой сервис. Нажмите «Обновить» и посмотрите, нет ли ошибок в журнале. Дважды щелкните по строке для более подробной информации.

0 голосов
/ 09 июня 2011

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

Возможно ли, что код в событии OnStart на самом деле занимает больше времени, чем вы ожидаете. Если это так, вы можете переместить этот код в поток, чтобы событие OnStart завершилось (и Windows считает, что служба запущена), а поток продолжает работать.

Вы работаете в качестве администратора? Если так, то это обычно исключает проблемы с разрешениями. (Если это все еще пойдет не так, это исключит проблему KB 886695, так как это, похоже, относится только к локальной системе).

Поскольку вы используете .NET 4.0, уверены ли вы, что установлена ​​полная версия, а не клиентский профиль, или что ваше приложение работает с клиентским профилем?

0 голосов
/ 09 июня 2011

В своем коде OnStart вы можете обернуть все в блок try-catch и записать сообщение об исключении и трассировать в файл, используя что-то вроде:

File.WriteAllText(@"C:\Temp\MyServiceLog.txt", exp.Message + exp.StackTrace);

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

  1. Форма, которая создает экземпляр класса обслуживания
  2. Новые методы DoStart и DoStop в моем классе обслуживания, которые являются общедоступными и вызывают защищенные OnStart и OnStop методы
  3. Новый код в вышеуказанных обработчиках OnLoad и OnClose, поэтому методы DoStart и DoStop экземпляра службы вызываются соответственно

Затем я добавляю следующий код в метод Main в Program.cs:

if (Environment.UserInteractive)
{
    Application.Run(new FormServiceHoster());
}
else
{
    // ... old code to create service instance.
}

Таким образом, вы запускаете «службу» как приложение, когда вы просто нажимаете F5 в Visual Studio или дважды щелкаете по EXE в Проводнике. Когда служба фактически запускается как служба, код Forms игнорируется.

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

Вам нужно будет добавить ссылки на System.Windows.Forms и System.Drawing вручную.

0 голосов
/ 09 июня 2011

Я предполагаю, что вы установили службу .NET 3.5 с использованием .NET 2.0? InstallUtil будет работать, поскольку CLR такой же, но служба не запускается из-за зависимостей .NET 3.5.

Смотрите также:

Как установить службу Windows, разработанную в .NET 3.5?

...