[英]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.