C#正在取消ServiceController服务状态更改请求
本文关键字:状态 请求 服务 ServiceController 取消 | 更新日期: 2023-09-27 18:21:36
我找不到任何关于这方面的信息,所以如果这是重复的,我很抱歉。
我正在使用ASP网站在我的代码背后触发WebMethod,该方法将触发计算机上的服务将其状态更改为前端指定的某个状态。
然而,我想这样做,当我在Timeout上调用ServiceController.WWaitForStatus()时,它会返回到调用前启动的默认状态。因此,如果某件事没有足够快地开始/暂停/停止,它就会像什么都没发生一样恢复到以前的状态。
有办法做到这一点吗?我试着调用ServiceController.close(),但对我没有任何帮助。
有没有一种方法可以优雅地管理这一点,这样,如果发生超时异常,它就会优雅地捕获异常,并将服务返回到服务控制器调用之前的原始状态。
这是我正在使用的web方法代码:
[WebMethod]
public static string ToggleService(string serverName, string serviceName, string newServiceState) {
ServiceController serviceToToggle = null;
if (newServiceState.ToLower().Equals("start")
|| newServiceState.ToLower().Equals("pause")
|| newServiceState.ToLower().Equals("stop")) {
serviceToToggle = new ServiceController(serviceName, serverName);
}
if (serviceToToggle != null)
{
try
{
if (serviceToToggle.Status == ServiceControllerStatus.Paused)
{
if (newServiceState.ToLower().Equals("start"))
{
serviceToToggle.Start();
serviceToToggle.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 1));
}
else if (newServiceState.ToLower().Equals("stop"))
{
serviceToToggle.Stop();
serviceToToggle.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 1));
}
}
else if (serviceToToggle.Status == ServiceControllerStatus.Running)
{
if (newServiceState.ToLower().Equals("pause"))
{
serviceToToggle.Pause();
serviceToToggle.WaitForStatus(ServiceControllerStatus.Paused, new TimeSpan(0, 0, 1));
}
else if (newServiceState.ToLower().Equals("stop"))
{
serviceToToggle.Stop();
serviceToToggle.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 1));
}
}
else if (serviceToToggle.Status == ServiceControllerStatus.Stopped)
{
if (newServiceState.ToLower().Equals("start"))
{
serviceToToggle.Start();
serviceToToggle.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 1));
}
}
return "'"OutputStatus'": '"Success'"";
}
catch (Exception e) {
serviceToToggle.Close();
return "'"OutputStatus'": '"Failed'"";
}
}
return "No service to toggle";
}
我将感谢任何对此的帮助或见解。
简而言之,no-没有办法恢复或取消已发送到服务的命令。
您可以编写代码来记住以前的状态,并在出现问题或超时时启动控制器请求来再次设置该状态,但听起来并不是特别健壮。
如果它们是您自己的服务,最好编写它们以正确响应服务请求。