如何在網頁啟動Windows服務


由於公司有許多windows服務進行業務的處理,所以對服務的維護也是一個比較頭痛的問題,因為自己也不知道服務什么時候自動停了,而且更主要的原因是服務都是由運維部門在維護管理,開發這邊沒有直接操作服務的權限,所以利用網頁監控服務就很重要了(在服務中也可以增加郵件提醒,比如服務報錯或者斷掉)。

s3

如何獲取電腦上的所有服務:

使用.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是我新建的一個實體類,用來保存相關服務的信息。前提頁面部分截圖如下:

s1

根據服務的當前狀態,可以對服務進行:停止、啟動、重啟等操作。由於我是根據點擊的操作,傳到一般處理程序進行處理的,所以直接上代碼,很簡單:

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調試程序對服務進行停止、啟動等操作的時候,報

s2

解決辦法:關閉VS,用管理員身份運行程序即可解決問題

 

2、將網頁部署到IIS進行訪問的時候,可能提示沒權限操作等原因:

首先還是介紹下IIS的安裝吧,估計大家對這個都沒問題了

控制面板--->程序和功能--->啟用或關閉Windows功能--->Internet信息服務,如下圖:

s4

由於我用的是Win8,最開始我只勾選了一級目錄,就點擊安裝了,結果運行IIS網站的時候,總是提示403錯誤,后來才發現是IIS安裝不全的問題,請根據上圖勾選即可。

當IIS安裝完全之后,網站可以運行了,但是在操作服務的時候提示權限不足原因,請在IIS設置如下:

s5

我這里是DefaultAppPool程序池,鼠標右擊該程序池-->高級設置,如下如:

s6

 

 

標識這里選擇內置賬戶為:LocalSystem,或者選擇自定義賬戶,新建一個有權限的賬號也可以。

再次運行網站,對我們的服務進行停止、啟動等操作,發現一切正常。

以上就是今天在做有關網頁對服務進行操作說遇到的問題,希望能幫到有同樣需求的人。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM