C#取消ServiceController服务状态更改请求

时间:2013-07-08 17:30:19

标签: c# asp.net service

我无法找到任何相关信息,所以如果这是重复的话我会道歉。

我正在使用ASP网站触发我的代码后面的WebMethod,它会触发计算机上的服务,将其状态更改为前端指定的状态。

但是,我想这样做,以便当我在Timeout上调用ServiceController.WaitForStatus()时,它返回到它在调用之前启动的默认状态。因此,如果某些事情没有足够快地开始/暂停/停止,它将恢复到之前的状态,就像没有发生任何事情一样。

有办法做到这一点吗?我试着调用ServiceController.close(),这对我没有任何作用。

有没有办法优雅地管理它,以便在发生超时异常时正常捕获异常,并在服务控制器调用之前将服务返回到其原始状态。

这是我正在使用的网络方法代码:

[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";
    }

我将不胜感激任何帮助或见解。

1 个答案:

答案 0 :(得分:0)

简而言之,不 - 没有办法恢复或取消已发送给服务的命令。

您可以编写代码来记住以前的状态,并启动控制器请求,以便在出现问题或超时时再次设置该状态,但听起来不是特别健壮。

如果它们是您自己的服务,最好编写它们以正确响应服务请求。