2

コマンドを介して指示されたときにさまざまなタスクを実行する Windows サービスを作成する必要があるプロジェクトがあります。このサーバーは複数のサーバーで実行され、要求されたときに同じ種類のタスクを効果的に実行します。

たとえば、サーバーからの要求をリッスンする Web API サービスが必要です。

サーバー上で実行されているサービスは、約 25 秒ごとにクエリを Web API に送信し、サーバー名を渡します。次に、Web API ロジックは SERVERNAME を検索し、さまざまなタスクのステータスの更新を探します...つまり、DELETE コマンドのステータスが 1 の場合、サービスはログ ファイルを含むフォルダーを削除します...ステータスがZIP コマンドが 1 の場合、サービスはログ ファイルを含むフォルダーを圧縮し、それらを中央の場所に FTP 送信します。

このコンセプトは十分に単純に思えますが、これが良いデザインのように聞こえるかどうかを教えてもらうには、ナッジが必要だと思います. Windows サービスに .NET 4.5 を使用することを考えています。これにより、HttpClient オブジェクトと、もちろん Web API/MVC プロジェクトに .NET 4.5 を使用できるようになります。

実行中の Windows サービスにステータスの更新を提供し、それらにコマンドを発行する基本的な Web API がどのようなものかについて、誰か教えてください...

さまざまなラジオボタンをクリックして「DELETE」、「ZIP」などをオンにできるサーバーのリスト(おそらく単純なXMLファイルなどに基づく)を持つ単純なMVC Webサイトを作成することを考えています。サービスでタスクをトリガーします。

4

2 に答える 2

1

私は似たようなことをします。アプリケーションを駆動するメインのWebAPI(Windowsサービス)があり、。というリソースがあり/Heartbeatます。

また、30秒ごとにタイマーが起動する2番目のWindowsサービスもあります。タイマーが起動するたびに、POSTが呼び出されます/heartbeat。ハートビート要求が処理されると、スケジュールされているタスクを探します。

このアプローチの利点は、サービスがhearbeatリクエストを非常に単純にし、更新する必要がないことです。ハートビートで何が起こるかに関連するすべてのロジックは、メインサービスにあります。

サービスの根性はこれです。これは古いコードであるため、HttpClientの代わりにHttpWebRequestを使用していますが、変更するのは簡単です。

 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);
            }

        }


    }
于 2013-02-16T02:07:47.960 に答える
0

ServiceController.ExecuteCommand().NETのメソッドで実行できます。このメソッドを使用すると、カスタム コマンドを Windows のサービスにサンドできます。ServiceBase.OnCustomCommand()次に、サービスで、着信​​カスタム コマンド イベントをサービスで提供するように実装する必要があります。

const int SmartRestart = 8;

...

//APPLICATION TO SEND COMMAND
service.ExecuteCommand(SmartRestart);

...

//SERVICE
protected override void OnCustomCommand(int command)
{
    if (command == SmartRestart)
    {
        // ...
    }
}
于 2015-04-27T13:00:14.683 に答える