C# 使用Windows服务的Web API通过轮询接收命令和执行任务?
我有一个项目,我需要创建一个windows服务,当通过命令指示时,它将执行各种任务。此服务器将在多个服务器上运行,并在请求时有效地执行相同类型的任务 例如,我希望有一个Web API服务来侦听来自服务器的请求 服务器上运行的服务将每隔25秒左右向Web API发送一个查询,并将其服务器名传递给它。然后Web API逻辑将查找服务器名,并查找各种任务的任何状态更新。。。即,如果删除命令的状态为1,则服务将删除包含日志文件的文件夹。。。如果ZIP命令的状态为1,则服务将压缩包含日志文件的文件夹,并将其FTP到集中位置 这个概念似乎很简单,我想我需要一点提示来告诉我这听起来是否是一个好的设计。我正在考虑在Windows服务中使用.NET 4.5,这样我就可以在Web API/MVC项目中使用HttpClient对象,当然还有.NET 4.5 有人能告诉我一个基本的Web API应该是什么样子的吗?为正在运行的Windows服务提供状态更新并向它们发出命令C# 使用Windows服务的Web API通过轮询接收命令和执行任务?,c#,asp.net-mvc,windows-services,asp.net-web-api,C#,Asp.net Mvc,Windows Services,Asp.net Web Api,我有一个项目,我需要创建一个windows服务,当通过命令指示时,它将执行各种任务。此服务器将在多个服务器上运行,并在请求时有效地执行相同类型的任务 例如,我希望有一个Web API服务来侦听来自服务器的请求 服务器上运行的服务将每隔25秒左右向Web API发送一个查询,并将其服务器名传递给它。然后Web API逻辑将查找服务器名,并查找各种任务的任何状态更新。。。即,如果删除命令的状态为1,则服务将删除包含日志文件的文件夹。。。如果ZIP命令的状态为1,则服务将压缩包含日志文件的文件夹,并将
我正在考虑建立一个简单的MVC网站,人们将有一个服务器列表(可能基于一个简单的XML文件或其他东西),他们可以单击各种单选按钮来打开“删除”、“压缩”或其他按钮,以触发服务上的任务。我做了类似的事情。我有一个驱动我的应用程序的主Web API(Windows服务),还有一个名为
/Heartbeat
的资源
我还有第二个Windows服务,它每30秒触发一次计时器。每次计时器触发时,它都会调用POST/heartbeat
。当heartbeat请求得到处理时,它将查找已调度的任务
这种方法的优点是,该服务使得hearbeat请求非常简单,并且永远不需要更新。与心跳发生的情况相关的所有逻辑都在主服务中
const int SmartRestart = 8;
...
//APPLICATION TO SEND COMMAND
service.ExecuteCommand(SmartRestart);
...
//SERVICE
protected override void OnCustomCommand(int command)
{
if (command == SmartRestart)
{
// ...
}
}
这项服务的精髓在于此。它是旧代码,所以它仍然使用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)
{
// ...
}
}
是的,这听起来和我想做的差不多。你有什么可以分享的示例代码吗?听起来我也想做一个心跳式的事情,除此之外。。。当然,还有多个服务器调用Web API。