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