2

持っているプログラムをサービスにして、ログに記録せずに使えるようにしたい。基本的には、SSH を使用して指定したフォルダーを指定した場所にバックアップします。しかし、私が直面している問題は、これらの項目を伝える方法がわからないことです。パラメータ付きの整数のみを使用してカスタムコマンドを開始、停止、および実行する方法しか知りません。

これどうやってするの?

Web サービスではなく Windows サービス

edit : バックアップするフォルダーは一貫性を維持せず、ランタイムごとに更新されます

4

10 に答える 10

6

ServiceController クラスを使用して、サービスをインスタンス化し、コマンド ライン引数を渡すことができます。

using (ServiceController serviceController = new ServiceController(serviceName))
{
   string[] args = new string[1];
   args[0] = "arg1";
   serviceController.Start(args);
}

「arg1」は、Windows がサービスを開始するときに、main() で通常のコマンド ライン引数として使用できます。

于 2009-01-19T19:19:54.910 に答える
2

あなた (または誰か) が Sebastian Sedlak の回答に反対票を投じたようです。なぜなら、彼は Windows サービスで WCF サービスをホストすることに言及したからです。あなたの返事は

It's in nice bold lettering in the question. Not a Web Service, therefor WCF is out of the question

あなたは彼の意味を誤解していると思います。彼はWeb サービスについて話していませんでした。彼は、Windows Service内でWCF Service をホストすることについて話していました。

同じことにはほど遠い。任意の Windows (フォーム/コンソール/サービス) アプリケーションで WCF サービスをホストできます。そうすることのポイントは、Web サービスと通信できるのと同じ方法で、内部 WCF サービスを介して通信のためにアプリケーションに到達できることです ( IIS で WCF サービスをホストすることできます。あなたが言及しているように見える意味での「Webサービス」)。

Windows サービスでは、実行中にコマンドを送信したり、必要な情報を取得したりできることを意味します。

実際、私は現在、実行時に連絡してコマンドを渡し、情報を取得する必要がある Windows サービスであるプロジェクトに取り組んでいます。たとえば、特定のものをどこに保存するか、何をログに記録するか、リセット/再起動するか、ステータスメッセージをポーリングするかを指定できるようにしたいと考えています。これを行うには、Windows サービス内で WCF サービスをホストします。その WCF サービスは一連のメソッドを公開します。私の場合は、コマンドを受信して​​ステータス情報を返すことが含まれます。そのため、 Windows サービスが実行されているときは、組み込みのWCF サービスを介して (リモートでも) 接続して、何をすべきかを伝えることができます。

これは非常に簡単に実装でき、Windows サービスの場合、基本的な標準コマンドを使用するよりもはるかに豊富なインターフェイスをサービスに提供できます。


ただし、Windows サービスが起動するたびにフォルダー設定を受け取るように指定したため、このような受動的な設定は理想的ではありません (適切なフォルダーを渡すまで何もできないため)。

これに対処する 1 つの方法 (ホストされた WCF サービスを使用) は、Windows サービスを常に実行することです (つまり、自動スタートアップ)。デフォルトの状態はアイドルです。次に、「処理の開始」コマンドを発行して、作業する正しいフォルダーを (対応する WCF サービス メソッドの呼び出しを通じて) 供給することができます。同様に、WCF サービスは、アプリケーションのステータス (現在のフォルダー、進行状況、ビジー/アイドルなど) を提供するメソッドを公開します。処理が完了すると、アイドル状態に戻り、次の一連のフォルダーが提供されるのを待ちます。

このようにすると、リモートでの制御が非常に簡単になります。どこからでもアクセスできるオンライン管理パネルを作成することもできます。

于 2010-10-31T01:29:33.113 に答える
2

問題は、パラメーターを渡すことは難しくありませんが、マシンが再起動し、Windows がサービスを再起動しようとすると、それらのパラメーターが存在しないことです。誰かがコマンドラインからサービスを開始したときにのみ存在します。

例えば。WCF サービスをホストする Windows サービスがあります。WCF サービスがリッスンするために、ユーザーがデフォルト以外のポート番号を指定できるようにしたいと考えています。これは、次のように Windows サービスを開始することによって行われます... MyService -port:xxxxx

サーバーが再起動されるまで、これは正常に機能し、Windows は MyService を再起動し (ただし、パラメーターなしで)、wcf サービスはデフォルトで元のポート # に設定されます。

于 2011-08-30T17:05:31.267 に答える
1

RE:設定ファイル。

もちろん、設定ファイルを使用することもできます。また、サービスの実行中にファイルを変更できます。

設定ファイルが実際に変更された場合、これは優れたソリューションになります。私のすべてのサービスは、簡単に再利用できるようにクラスにラップされたXML構成ファイルを使用しています。

ラッパーには、fileMonitorを使用してXMLファイルの変更を監視するオプションがあり、オプションで構成ファイルのコンテンツを自動的に更新し、最後にサービスクラスにイベントを発生させます。その後、サービスには、XML構成ファイルに新しい値を組み込むために、必要に応じてそれ自体を「リセット」するオプションがあります。

レジストリに構成を配置するには、いくつかの問題があります。

  • 使用されているツリーに応じて、セキュリティ(つまり、インストーラーにアクセスが許可される)
  • サービスは変更を認識しません
  • 移植性-インストールではレジストリ設定をセットアップする必要があるため、マイナーですが

XMLファイルのコピー、編集、共有、表示、および理解が容易な場合。いくつかの優れたCOMMENTブロックと詳細なXSDファイルを投入すると、優れたドキュメントのソースにもなります。

XPathを調べて、XMLファイル内の値のナビゲーションと抽出を簡単にします。

$0.02...デビッド..。

于 2011-10-01T01:51:32.153 に答える
1

Windows サービスで WCF サービスをホストして、そのような「管理」機能を取得しないのはなぜですか? (リモートも可能です)

于 2009-01-19T19:26:49.763 に答える
1

これらの項目を指定するために構成ファイルを使用することは可能でしょうか?

于 2009-01-19T18:50:03.020 に答える
1

サービスのスタートアップ パラメータをレジストリに保存します。次に、レジストリの起動時に、レジストリからスタートアップ パラメータを読み取る必要があります。

于 2009-01-19T18:51:16.700 に答える
1

どのサービスも、起動時にコマンド ライン引数を受け取ることができます。

于 2009-01-19T18:51:39.040 に答える
1

Windows サービスには、他のサービスと同様に実行可能ファイルがあります。コマンド ライン パラメーターを受け入れ、Windows サービス構成でそれらのパラメーターを指定するように記述できると思います。構成ファイルを読み取らせることもできます。.NET を使用している場合は、フレームワークに構成ファイル クラスがあります。

于 2009-01-19T18:53:12.703 に答える
0

app.config ファイルについて - 私はすべての Windows サービスをこのように書いているので、あなたのサービスがこれらのファイルを読み込んで使用することを確信しています;)ユーザー) そして、サービスを "InstallUtil" したフォルダー内の "yourname.exe.config" を常に編集します。

于 2011-08-30T17:11:36.143 に答える