c# - 将 Web API 用于 Windows 服务以通过轮询接收命令和执行任务?

标签 c# asp.net-mvc windows-services asp.net-web-api

我有一个项目,我需要在其中创建一个 Windows 服务,当通过命令指示时,该服务将执行各种任务。该服务器将在多个服务器上运行,并在收到请求时有效地执行相同类型的任务。

例如,我想要一个 Web API 服务来监听来自服务器的请求。

服务器上运行的服务将每 25 秒左右向 Web API 发送一次查询,并将其 SERVERNAME 传递给它。然后,Web API 逻辑将查找 SERVERNAME 并查找各种任务的任何状态更新......即,如果 DELETE 命令的状态为 1,则服务将删除包含日志文件的文件夹......如果状态对于 ZIP 命令为 1,该服务将压缩包含日志文件的文件夹并将它们通过 FTP 传输到一个集中位置。

这个概念看起来很简单,我想我需要一点提示来告诉我这听起来是不是一个好的设计。我正在考虑将 .NET 4.5 用于 Windows 服务,这样我就可以使用 HttpClient 对象,当然还有 .NET 4.5 用于 Web API/MVC 项目。

有人可以让我开始了解基本的 Web API 会是什么样子,为正在运行的 Windows 服务提供状态更新并向它们发出命令...

我正在考虑有一个简单的 MVC 网站,人们将有一个服务器列表(可能基于一个简单的 XML 文件或其他东西),他们可以单击各种单选按钮来打开“DELETE”、“ZIP”或不管怎样,触发服务上的任务。

最佳答案

我也在做类似的事情。我有一个主要的 Web API(一个 Windows 服务)来驱动我的应用程序,并且有一个名为 /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);
            }

        }


    }

关于c# - 将 Web API 用于 Windows 服务以通过轮询接收命令和执行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14902236/

相关文章:

javascript - 根据两个下拉列表的默认值禁用按钮

c# - SupportedUICultures 不显示所有文化

javascript - 使用 AJAX/jQuery 将 SelectList 获取到 MVC View

windows - 如何在 Windows 中获取当前的交互式用户 session 数?

logging - Windows 服务日志文件位置的 'best practice' 是什么?

c# - Windows Phone 8 - 创建 "Fade-in and slide-in"动画

c# - 在这种情况下,LINQ是最好的解决方案吗? LINQ到数据集

c# - 将 Windows 服务作为 "Local System"运行有哪些安全风险?

c# - 在 C# 中将匿名对象作为参数传递

c# - 如何最好地在 ASP.NET Core 中实现 Google 社交登录身份验证?