2013-07-08 28 views
1

我一直未能找到任何有關此信息,所以我很抱歉,如果這是重複的。C#取消ServiceController服務狀態更改請求

我正在使用ASP網站在我的代碼後面觸發WebMethod,這將觸發計算機上的服務將其狀態更改爲前端指定的某種狀態。

但是,我想使它在Timeout上調用ServiceController.WaitForStatus()時返回到它在調用之前啓動的默認狀態。所以,如果某些事情沒有開始/暫停/停止足夠快,它會恢復到以前的狀態,就像什麼都沒有發生過。

有沒有辦法做到這一點?我試着調用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"; 
    } 

我希望得到任何幫助或洞察這一點。

+0

總之,沒有 - 沒有辦法恢復或取消已發送到服務的命令。您可以編寫代碼來記住以前的狀態,並在出現錯誤或超時的情況時啓動控制器請求以重新設置該狀態,但聽起來並不健全。如果他們是您自己的服務,最好編寫它們以正確響應服務請求。 –

+1

非常感謝。我認爲這將是答案。我已經做了相應的規劃,並將以另一種方式再次處理這個問題。你可以把這個作爲答案,所以我可以將其標記爲正確的答案,並給你信用? – GenericDeveloper

回答

0

總之,沒有 - 沒有辦法恢復或取消已發送到服務的命令。

您可以編寫代碼來記住以前的狀態,併發起一個控制器請求,以便在出現錯誤或超時的情況時再次設置該狀態,但聽起來並不健全。

如果他們是您自己的服務,最好編寫它們以正確響應服務請求。