標籤:style blog http color io os ar 使用 for
由於公司有許多windows服務進行業務的處理,所謂對服務的維護也是一個比較頭痛的問題,因為自己也不知道服務什麼時候自動停了,而 且更主要的原因是服務都是由營運部門在維護管理,開發這邊沒有直接操作服務的許可權,所以利用網頁監控服務就很重要了(在服務中也可以增加寄件提醒,比如服 務報錯或者斷掉)。
如何擷取電腦上的所有服務:
使用.Net架構類庫中內建的組件ServiceController可以實現對 Windows服務的操作。
1、首先要在你的項目添加引用System.ServiceProcess命名空間;
2、建立ServiceController的執行個體;
//擷取當前電腦上的所有非裝置驅動程式服務ServiceController[] myServices = ServiceController.GetServices();
GetServices方法有一個重載,預設擷取原生服務,如果想擷取某台機器上的服務,則要指定機器名,前提是要有許可權擷取。
由於是用網頁擷取電腦上的所有服務,我就直接貼網頁後台代碼了,如下:
protected void Page_Load(object sender, EventArgs e) { ServiceController[] myServices = ServiceController.GetServices(); list = new List<ServiceModel>(); foreach (var item in myServices) { if (item.ServiceType == ServiceType.Win32OwnProcess) { ServiceModel model = new ServiceModel(); model.ServiceName = item.ServiceName; model.DisplayName = item.DisplayName; if (item.Status == ServiceControllerStatus.Running) model.IsRunning = true; else model.IsRunning = false; list.Add(model); } } }
其中ServiceModel是我建立的一個實體類,用來儲存相關服務的資訊。前提頁面部分如下:
根據服務的目前狀態,可以對服務進行:停止、啟動、重啟等操作。由於我是根據點擊的操作,傳到一般處理常式進行處理的,所以直接上代碼,很簡單:
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //服務名 string serviceName = context.Request.QueryString["serviceName"]; //操作類型【重啟、停止、重啟】 string type = context.Request.QueryString["type"]; try { switch (type) { case "start": StartService(serviceName); break; case "stop": StopService(serviceName); break; case "reset": ResetService(serviceName); break; default: ResetService(serviceName); break; } context.Response.Write("ok"); } catch (Exception ex) { context.Response.Write(ex.Message); } } /// <summary> /// 啟動服務 /// </summary> /// <param name="serviceName">服務名</param> private void StartService(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); service.Close(); } } /// <summary> /// 停止服務 /// </summary> /// <param name="serviceName">服務名</param> private void StopService(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped); service.Close(); } } /// <summary> /// 重啟服務 /// </summary> /// <param name="serviceName">服務名</param> private void ResetService(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running || service.Status == ServiceControllerStatus.Stopped) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); service.Close(); } }
代碼很簡單,一看簡單明了,呵呵…
開發注意事項:
1、如果用VS偵錯工具對服務進行停止、啟動等操作的時候,報
解決辦法:關閉VS,用管理員身份運行程式即可解決問題
2、將網頁部署到IIS進行訪問的時候,可能提示沒許可權操作等原因:
首先還是介紹下IIS的安裝吧,估計大家對這個都沒問題了
控制台--->程式和功能--->啟用或關閉Windows功能--->Internet資訊服務,如:
由於我用的是Win8,最開始我只勾選了一級目錄,就點擊安裝了,結果運行IIS網站的時候,總是提示403錯誤,後來才發現是IIS安裝不全的問題,請根據勾選即可。
當IIS安裝完全之後,網站可以運行了,但是在操作服務的時候提示許可權不足原因,請在IIS設定如下:
我這裡是DefaultAppPool程式池,滑鼠右擊該程式池-->進階設定,如下如:
標識這裡選擇內建賬戶為:LocalSystem,或者選擇自訂賬戶,建立一個有許可權的帳號也可以。
再次運行網站,對我們的服務進行停止、啟動等操作,發現一切正常。
以上就是今天在做有關網頁對服務進行操作說遇到的問題,希望能幫到有同樣需求的人。
如何在網頁啟動Windows服務