簡體   English   中英

使用Windows服務的Web API通過輪詢接收命令並執行任務?

[英]Using Web API for a Windows Service to Receive Commands and Perform Tasks via Polling?

我有一個項目,我需要在其中創建一個Windows服務,該服務在通過命令指示時將執行各種任務。 該服務器將在多台服務器上運行,並在請求時有效執行相同類型的任務。

例如,我想要一個Web API服務,該服務偵聽來自服務器的請求。

在服務器上運行的服務將每25秒左右向Web API發送一次查詢,並將其SERVERNAME傳遞給它。 然后,Web API邏輯將查找SERVERNAME並查找各種任務的任何狀態更新... IE,如果DELETE命令的狀態為1,則服務將刪除包含日志文件的文件夾...如果狀態為如果ZIP命令為1,則服務會將包含日志文件的文件夾壓縮並通過FTP將其傳輸到集中位置。

這個概念似乎很簡單,我想我需要輕聲告訴我這聽起來像是一個好的設計。 我正在考慮為Windows服務使用.NET 4.5,以便可以將HttpClient對象以及Web應用程序API / MVC項目使用.NET 4.5。

有人可以幫助我開始介紹基本的Web API外觀,為正在運行的Windows服務提供狀態更新並向其發出命令...

我正在考慮建立一個簡單的MVC網站,人們將擁有一個服務器列表(可能基於簡單的XML文件或類似的東西),他們可以單擊各種單選按鈕以打開“刪除”,“郵政編碼”或其他任何內容。觸發服務上的任務。

我做類似的事情。 我有一個主要的Web API(Windows服務),該API驅動我的應用程序,並具有一個名為/Heartbeat的資源。

我還有第二個Windows服務,該服務每30秒觸發一次計時器。 每次計時器觸發時,它都會調用POST /heartbeat 處理心跳請求后,它將查找已安排的任務。

這種方法的優點是該服務使監聽信號請求非常簡單,並且不必更新。 與心跳發生的事情有關的所有邏輯都在主服務中。

服務的膽量是這個。 它是舊代碼,因此仍在使用HttpWebRequest而不是HttpClient,但這很微不足道。

 public partial class HeartbeatService : ServiceBase {
        readonly Timer _Timer = new System.Timers.Timer();

        private string _heartbeatTarget;


        public HeartbeatService() {
            Trace.TraceInformation("Initializing Heartbeat Service");
            InitializeComponent();
            this.ServiceName = "TavisHeartbeat";
        }

        protected override void OnStart(string[] args) {
            Trace.TraceInformation("Starting...");
            _Timer.Enabled = true;

            _Timer.Interval = Properties.Settings.Default.IntervalMinutes * 1000 * 60; 
            _Timer.Elapsed += new ElapsedEventHandler(_Timer_Elapsed);

            _heartbeatTarget = Properties.Settings.Default.TargetUrl; 
        }

        protected override void OnStop() {
            _Timer.Enabled = false;
        }

        private void _Timer_Elapsed(object sender, ElapsedEventArgs e) {
            Trace.TraceInformation("Heartbeat event triggered");
            try {

                var httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(_heartbeatTarget);
                httpWebRequest.ContentLength = 0;
                httpWebRequest.Method = "POST";
                var response = (HttpWebResponse)httpWebRequest.GetResponse();
                Trace.TraceInformation("Http Response : " + response.StatusCode + " " + response.StatusDescription); 
            } catch (Exception ex) {
                string errorMessage = ex.Message;
                while (ex.InnerException != null) {
                    errorMessage = errorMessage + Environment.NewLine + ex.InnerException.Message;
                    ex = ex.InnerException;
                }
                Trace.TraceError(errorMessage);
            }

        }


    }

您可以使用.NET中的ServiceController.ExecuteCommand()方法來實現。 使用該方法,您可以將自定義命令打入Windows服務。 然后,在您的服務中,您需要實現ServiceBase.OnCustomCommand()來在服務中提供傳入的自定義命令事件。

const int SmartRestart = 8;

...

//APPLICATION TO SEND COMMAND
service.ExecuteCommand(SmartRestart);

...

//SERVICE
protected override void OnCustomCommand(int command)
{
    if (command == SmartRestart)
    {
        // ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM