問題タブ [topshelf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
model-view-controller - MVCWebアプリケーションでTopShelfを実行する
構築しているWebアプリケーションのバックグラウンドタスクを実行する必要があります。Topshelfを使用してサーバー上でサービスを実行する外観が好きです。サービスを初期化する最善の方法を考えていました。MVCアプリケーションの起動からサービスを開始するのは悪い考えではないかと思っていました
例えば:
明らかに、アプリケーションを起動するジョブは、独自のタスクで実行されます。これを行うためのより良い方法はありますか?これに問題がありますか?
私の考えでは、サービスが開始されると、それ以降は自分自身を処理します。
私の唯一の考えは、Webアプリケーションを複数回再起動する場合ですが、サービスがすでに実行されている場合は別のサービスを開始しないことを確認するためのロジックを挿入できると思いました。
c# - Topshelf - ループの処理
一般に、サービスでは、完了したいタスクが繰り返されます。おそらくループまたはトリガーまたはその他のものです。
私はTopshelfを使用して繰り返しタスクを完了しています。具体的には、Shelf'ing 機能を使用しています。
私が抱えている問題は、タスクのループを処理する方法です。
Topshelf でサービスをブートストラップするときは、クラス (この場合ScheduleQueueServiceは ) を渡し、どちらがそのStartメソッドであり、それがメソッドであるかを示しますStop。
例:
しかし、私のStartService()方法では、while ループを使用して実行中のタスクを繰り返していますが、Windows サービスを介してサービスを停止しようとすると停止に失敗し、StartService()メソッドが最初に呼び出されたときに終了しなかったためと思われます。
例:
これを行うより良い方法は何ですか?
.NET
System.Threading.Tasksを使用して作業を実行し、StopService() でスレッドを閉じることを検討しました。おそらくQuartzを使用してタスクを繰り返してから削除します。
考え?
c# - Windowsサービス内のConsole.WriteLine()?
現在、Windows サービスを作成するためにコンソール アプリケーションで TopShelf を使用しています。コードをコンソール アプリケーションとして実行するときは、いくつかの Console.WriteLine() を使用して結果を出力します。コードが本来の目的を果たしたら、コンソール アプリケーションを Windows サービスとしてインストールします。
Windows サービスがコンソールに書き込めない場合でも、Console.WriteLine() コードを残すことの欠点はありますか? Console.WriteLine() をそのままにしておくと、コードが不安定になるリスクはありますか?
udp - Windows サービスの Log4net UDP アペンダー
TopShelf を使用して開発された非常に単純な Windows サービスがあります。私は log4net を使用しており、UDP アペンダーが構成されています。Log2Console というアプリを使用して UDP ログを表示しています。
アプリを exe として実行するとすべて正常に動作し、Log2Console で UDP ログを確認できます。ただし、TopShelf を使用して exe をサービスとしてインストールして起動すると、UDP ログが表示されません。
Windows ファイアウォールをオフにして、違いが生じるかどうかを確認しようとしましたが、違いはありませんでした。また、サービスのログオンの詳細を変更しようとしましたが、運もありません。
助言がありますか?
ありがとう。
windows-services - TopShelf、Ninject、および EF コードを最初に使用した Ninject スコープの問題
現在、Ninject で TopShelf を使用して Windows サービスを作成しています。TopShelf を使用して Windows サービスをセットアップする次のコードがあります。
これは、すべての作業を行う Windows サービスの背後にあるオブジェクトです。
これらは Ninject バインディングです:
まず、私はこのコードに満足していません。アプリケーションが起動すると、カーネルのインスタンスが作成され、設定から値が取得され、TopShelf を使用して BotService オブジェクトを使用する Windows サービスを作成します。
タイマー イベントが発生するたびに、Run() メソッドが実行されます。ここで、カーネルの別のインスタンスが作成され、再び設定が読み取られ、値に応じて、カーネルはインターフェースのすべての実装をフェッチし、対応するメソッドを実行します。これらの各実装には、データ アクセスのために IUnitOfWork と IMyRepository が挿入されるコンストラクターがあります。
メソッドが終了したら、コンテキストを破棄し、カーネルを破棄します。
なぜ私はそれをこのように設定したのですか?もともと、メインでカーネルを 1 つだけ作成し、カーネルの別のインスタンスを作成するのではなく、BotService でコンストラクターを使用して実装を注入しました。問題は、DatabaseFactory が機能するために InSingletonScope または InThreadScope を必要とすることでした。
InSingeltonScope を使用すると、コンテキストが古くなり、最終的にコンテキストが無効な場所で問題が発生し始めます。InThreadScope を使用した場合、スレッドが完了するとオブジェクトが破棄されないため、同じ問題が発生します。最終的に Run() は以前に使用されたスレッドを使用し、コンテキストを既に破棄したため例外が発生しました。コンテキストを適切に破棄するコード行を削除すると、InSingletonScope と同じ問題が発生し、スレッドが再利用されたときに古いコンテキストになってしまいます。
これにより、Time Run() が実行されるたびにコンテキストが実行されることが保証される現在のコードにつながり、それが破棄されるまでコンテキストが存在し、カーネルも同様に破棄されるため、次回同じスレッドが使用されることが保証されます。カーネルが再作成されてからの新しいコンテキスト (少なくとも、これが起こっていると思います)。
私の Ninject スキルはそれほど高度ではなく、この問題へのアプローチ方法に関する情報は非常に限られています。正しいアプローチは、メインのみに 1 つのカーネルを作成し、コンストラクターを介して必要なものを BotService オブジェクトに注入できるようにすることだと思います。ただし、同時に、このアプローチで上記のスコープのいずれかを使用した場合に発生する古いコンテキストを回避するために、Run() ごとにコンテキストを作成する必要があります。
上記の例を正しく修正するにはどうすればよいですか? 現在、Ninject 2.2.1.4 を使用しています。
topshelf - トップシェルフマルチホスト
1つの実行可能ファイルで複数のホストを実行する方法はトップシェルフにありますか?
編集
スレッドで解決しました。しかし、それが安全かどうかはわかりません...
c# - TopShelf サービスの単一インスタンスを強制する
Windows サービスをホストするために TopShelf を使用しています。これは私のセットアップコードです:
アプリケーションのインスタンスを 1 つだけ同時に実行できるようにする必要があります。現在、Windows サービスと任意の数のコンソール アプリを同時に開始できます。アプリケーションが起動中に他のインスタンスを検出した場合、アプリケーションは終了する必要があります。
私はミューテックスベースのアプローチが本当に好きですが、これをTopShelfで機能させる方法がわかりません。
c# - Topshelf サービス/アプリが「作成中」のままになっている
Topshelf のインスタンスを起動しようとしています。v. 2.3 のバイナリをダウンロードし、すべてを解凍しました。
次に、空のコンソール アプリケーションを作成しました。フレームワークを変更し.NET 4.0 framework、次のコードをstatic void Main()メソッドに追加しました。
F5 キーを押すと、consoleapp が期待どおりに実行されます。
次に、bin/release の出力を topshelf/services/test ディレクトリにコピーし、Topshelf.Host.exe を実行しました。結果は次のとおりです。

ブラウザでダッシュボードを表示すると、次のように表示されます。

「テスト」サービスは「作成中」と言い続けます (15 分以上待機)。
私は何を間違っていますか?複数の種類のコンソールアプリを試しました。コンソール アプリを呼び出すinstallと、アプリは正常に登録されます。
前もって感謝します!
c# - C# Windows サービスを開始するための Topshelf との統合テスト
Topshelfを使用して C# で記述された Windows サービスをホストしていますが、いくつかの統合テストを記述したいと考えています。私の初期化コードは、次のようなランチャー クラスに保持されます。
log4net と Ninject が適切にセットアップされ、Topshelf がサービスを開始することを確認するために、いくつかの統合テストを作成したいと考えています。Run()問題は、 Topshelf ホストを呼び出すとコードがブロックされるため、テスト コードが実行されないことです。
Launch()テストのセクションで別のスレッドを呼び出すことを考えましたが、終了する前にテストが実行されないようにするためSetUpに少しハックする必要があります。が返されないため、( のような) 適切な同期を使用できません。現在のコードは次のとおりです。Thread.Sleep(1000)Launch()ManualResetEventLaunch()
理想的には、私が探しているのは、サービスを起動する非ブロッキングの方法と、サービスを再度停止してTearDown. 現時点でTearDownは、ランチャーを破棄するだけです (つまり、TearDown文字通り破棄します!)。
この方法で Topshelf サービスをテストした経験のある人はいますか? 標準を使用して上記のことを比較的簡単に行うことができますがServiceHost、明示的な構成と Topshelf でのインストールの容易さを好みます。