繁体   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