2013-07-08 2 views
1

이 정보를 찾을 수 없어 중복 된 정보가 있으면 사과드립니다.C# ServiceController 서비스 상태 변경 요청 취소

ASP 웹 사이트를 사용하여 내 코드에서 WebMethod를 트리거하면 컴퓨터의 서비스가 프런트 엔드에 지정된 상태로 변경됩니다.

그러나 ServiceController.WaitForStatus()를 호출하면 Timeout에서 호출하기 전에 시작된 기본 상태로 되돌아갑니다. 그래서, 어떤 것이 시작되지 않거나 멈추거나 멈추게되면 아무 일도 일어나지 않았던 것처럼 이전 상태로 되돌아갑니다.

이 방법이 있습니까? ServiceController.close()를 호출 해 보았습니다.

정상적으로 예외를 처리하면 예외를 정상적으로 catch하고 서비스 컨트롤러 호출 이전의 원래 상태로 서비스를 되돌릴 수 있습니다.

[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

간단히 말해서, 이미 서비스에 전송 된 명령을 되돌리거나 취소 할 방법이 없습니다.

이전 상태를 기억하는 코드를 작성하고 오류가 발생하거나 시간이 초과되면 컨트롤러 상태를 다시 설정하도록 컨트롤러 요청을 시작할 수 있지만 특히 강력하게 들리지는 않습니다.

서비스가 자체 서비스 인 경우 서비스 요청에 올바르게 응답하도록 작성하는 것이 좋습니다.