Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Windows服务的Web API通过轮询接收命令和执行任务?_C#_Asp.net Mvc_Windows Services_Asp.net Web Api - Fatal编程技术网

C# 使用Windows服务的Web API通过轮询接收命令和执行任务?

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,则服务将压缩包含日志文件的文件夹,并将

我有一个项目,我需要创建一个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服务提供状态更新并向它们发出命令


我正在考虑建立一个简单的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。