С# запускает Windows Service программно
У меня возникла проблема с приложением, которое я создаю. Я пытаюсь запустить службу Windows через мое приложение С#. Когда я нажимаю кнопку "Пуск", все выглядит так, как будто все проходит, но когда я вхожу на сервер, служба по-прежнему не показывает, что она запущена. Однако во второй раз, когда я запускаю его, появляется исключение, в котором говорится, что экземпляр службы уже запущен. Опять же, когда я вхожу на сервер, служба оказывается остановленной. Кто-нибудь когда-нибудь видел это?
Вот мой код.
try
{
while (reader.Read())
{
int timeoutMilliseconds = 1000;
string serviceName = reader["ServiceName"].ToString();
string permission = reader["Permission"].ToString();
if (permission == "E")
{
lblServStartSuccess.Visible = true;
ServiceController service = new ServiceController(serviceName);
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
else
{
lblServErrorStart.Visible = true;
}
}
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
EDIT: Вот исключение, которое я получил по одной услуге:
System.InvalidOperationException: Служба логического диспетчера дискового управления не найдена на компьютере. '. ---> System.ComponentModel.Win32Exception: указанная служба не существует как установленная служба --- Конец внутренней трассировки стека исключений
Я знаю, что служба существует. Мне нужно добавить что-то перед службой, чтобы рассказать, на каком сервере посмотреть?
Ответы
Ответ 1
Если код, который вы показывали, выполняется на другом компьютере, чем там, где должна выполняться служба (я не понимаю ваши комментарии, если это так или нет), вам нужно указать имя машины в ServiceController Constructer. Возможно ли, что вы успешно запускаете сервис, но не на машине, о которой думаете? Это будет соответствовать симптомам, которые вы описываете.
ServiceController service = new ServiceController(serviceName, serverName);
http://msdn.microsoft.com/en-us/library/aa331793%28v=VS.71%29.aspx
Ответ 2
Вот код, который у меня есть в службе Windows, ответственной за прекращение запуска других служб, запущенных на том же сервере.
ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
controller.Stop();
if (controller.Status==ServiceControllerStatus.Stopped)
controller.Start();
Ответ 3
Это старый поток, но google заставил меня здесь. Мои службы, даже после успешного запуска, все равно будут запрашивать назад, как остановленные.
Если вы добавите
service.Refresh();
Он будет запрашивать фактический текущий статус вместо сохраненного состояния из предыдущего запроса. Я не знаю, почему это работает так, но это так.
P.S.: Я добавил минутный тайм-аут и до сих пор получил сообщение о прекращении службы без обновления.
Ответ 4
public static void StartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = 0;
TimeSpan timeout;
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch (Exception e)
{
Trace.WriteLine(e.Message);
}
}
public static void StopService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = 0;
TimeSpan timeout;
if (service.Status == ServiceControllerStatus.Running)
{
millisec1 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
}
}
catch (Exception e)
{
Trace.WriteLine(e.Message);
}
}
public static void RestartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = 0;
TimeSpan timeout;
if (service.Status == ServiceControllerStatus.Running)
{
millisec1 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
}
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch (Exception e)
{
Trace.WriteLine(e.Message);
}
}
Не забудьте добавить ServiceProcess в качестве ссылки
используя System.ServiceProcess;
Ответ 5
Просто попробуйте service.Start(); без тайм-аута или waitforstatus и подключить его события, чтобы увидеть, что происходит.
Ответ 6
Прежде всего вам нужно добавить ссылку на DLL (ServiceProcess) в свой проект. Ссылки:
Right click on References in Solution Explorer -> Add Reference -> Assemblies ->
Framework -> System.ServiceProcess
Затем добавьте в проект ProjectProcess DLL:
using System.ServiceProcess;
После этого используйте этот код:
ServiceController service = new ServiceController(yourServiceName);