2017-10-17 7 views
-6

現在、IOTデバイスからデータを読み取るためにTCP/IPポート読み取りアプリケーションを.Netで作成していますが、現在はWindowsアプリケーションとして実行されています。私はそれをWindowsサービスにしたい、良い選択肢はありますか?私はポート24/7を読んでみたい。 Windowsサービスよりも優れたオプションはありますか?より良いWindowsサービスまたはWindowsアプリケーションである.Netのポート読み取りアプリケーション

+2

Windowsサービスにしたい場合は、それは明らかに優れたオプションです。あなたが現在提供している詳細のレベルではなく、ここで適用する客観的な尺度はありません。 –

+2

ネットワークリソースが必要な場合は、LocalSystemまたはNetworkServiceで動作するWindowsサービス。ボリュームが高い場合やデバイス数が多い場合、その間にデータ統合/メッセージチャネルがある場合は、データを失わないようにKafkaのようなものを使用してください。 –

+0

開発とデバッグのWindowsアプリケーションの方が優れていますが、リリースのためにはWindowsサービスに向かいます。生産環境のコンソールウィンドウでうまくいけば、アプリケーションはうまくいきます。 – jabko87

答えて

2

はい、Windowsサービスは問題ありません。私はTopShelveと呼ばれる小さなライブラリを使ってサービス/コンソールアプリケーションを作りたいと思っています。次に、サービスを公開するためにNancyFxを追加し、そのデータ(または共有データベースから読み取る)を追加します。

また、「より良い」方法があるかどうか尋ねました。すべてのIoTデバイスをポーリングすることは良い考えではないと主張するかもしれません(リソースが多すぎるかもしれません)。メッセージキュー(ほとんどの小さなデバイスはMQTTを使用するのが好きです)に彼らの読書を(彼らが合っていると思われる時に)放送するようにしましょう。次に、アプリケーションは必要なキューにサブスクライブし、必要なときにデータを処理する必要があります。

7

ユーザーがログオンしていない状態でプログラムを実行できるようにするには、Windowsサービスが必要です。グラフィカルユーザーインターフェイスが必要な場合は、通常のアプリケーションがより便利です。

サイドノードとして、サービスとして開始し、アプリケーションとして開始するまでの間に、デバッグフラグを使用してアプリケーションを変更できます。サービスクラスをアプリケーションに追加し、カスタムコード用に別のクラスを追加します。このサービスはSampleクラスも呼び出します。そして、あなたはProgram.csの中でDEBUGの#if

public static void Main() 
    { 
#if DEBUG 
     SampleClass sc = new SampleClass(); 
     sc.Start(); 
#else 
     ServiceBase[] servicesToRun = new ServiceBase[] 
     { 
      new SampleService() 
     }; 
     ServiceBase.Run(servicesToRun); 
#endif 
    } 

をプリコンパイラを追加した場合、あなたはまた、各ビルドタイプごとに異なる

public static void WriteLog(string message, LogLevel logLevel) 
    { 
#if DEBUG 
      Console.WriteLine(message); 
#else 
      Trace.Write ($"{DateTime.Now:dd.MM.yyyy HH:mm:ss.fff} {message}"); 
#endif 
    } 
を働く出力するコードを追加することができ、デバッグ中に各を使用して切り替えることができます

その後、アプリを起動する場合は、ビルドとデバッグのどちらかを選択します。しかし、あなたはこの方法でサービスとしてのリリースビルドしかインストールできません。

+1

私はこのデザインが好きです。提案は[Windows Event Log](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventlog?view=netframework-4.7.1)にログインするサービスとして実行されるときです。 。これはWindowsサービスの一般的なプラクティスであり、トラブルシューティングの生産サービスを容易にすることができます。例えば、 'Exception'がキャッチされている場合は、完全なスタックトレース[必要に応じて]を使ってエラーとして' EventLog'に書き込むことができます。 – Zer0

0

.NETでサービスを書く経験はありません。私はいつもデバッグするのが面倒な印象を受けています。

あなたは「より良い選択肢」を求めましたが、これは別のオプションですが、それが良いかどうかはあなたの要件に大きく左右されます。その代わりに、タスクスケジューラを検討しましたか?

Visual Studio内で実行およびデバッグでき、定期的に実行する必要があるときにタスクスケジューラによって呼び出されるコマンドラインアプリケーションが.NETに多数あります。タスクスケジューラを使用したい場合は、ユーザインタラクション(およびGUIなし)は必要ありませんが、サービスにも同じ制限が適用されることを確認してください。長時間実行しているアプリケーションの場合は、タスクスケジューラを使用して実行を設定することができます。実行していない場合は、タスクマネージャを使用して定期的にタスクマネージャを再起動できます。

サービスはいくつかの方が適切です。確かに、タスクスケジューラを実行しているものよりも停止が簡単です(タスクスケジューラの場合、タスクマネージャでそのプロセスを見つけなければならないため)。

Windowsサービスとして実行したいのはなぜでしょうか。マシンが起動したときに実行を設定する手段としてのみ使用されている場合は、スケジュールされたタスクも同様に有効です。それはあなたがWindowsサービスを作成する経験をしたいので、それはWindowsサービスとしてそれを行う。等

1

いずれかを選択する理由は複数ある場合がありますが、ここでは決定に役立ついくつかの提案があります。

あなたは24時間7分と言いましたので、Windowsサービスは問題なく選択する必要があります。 ただし、次の点を考慮する必要があります。

すべての設定可能な値を設定ファイルに入れてください。例えば、リスニングポート、間隔、または再コンパイル/再デプロイせずに変更したいことがある他のものは、UIを制御できません。

jsonまたはxmlファイルにこれらの設定を保存しておき、設定ファイルを管理するためだけに別のUIを作成することもできます.Windowsサービスはこれらの設定から読み込みを行います。

また、Windowsサービスに配信する可能性があるサービス設定や操作/コマンドを操作する休息要求に応答するプロセスWeb APIエンドポイントでコードをWindowsサービスに追加することもできます。これにより、Windowsサービスは、ユーザーセッションの有無にかかわらずバックグラウンドで実行でき、また、休憩コールを介して別のマシンから制御することもできます。

しかし、これらはほんの少しのアイデアであり、どれだけあなたが行う必要があるかによって異なります。

1

アプリケーションは、デスクトップ上で対話するプログラムです。

Microsoft Windowsサービスは、24時間年中無休のサービスの問題に対処し、GUI指向のフォームアプリケーションから離れるように特別に設計されています。 C#はWindowsサービスの開発方法のサンプルを提供します。エラーロガーシステムに加えて、それはあなたのソリューションの不可欠な部分になることができます。 Windowsサービスをデバッガに対応させるには、

Topshelf technology.Iを使用し、開発/デバッグ時間を大幅に短縮しました。

-1

なぜホイールを再構築しますか?あなたはWinDivertを使用すること :

は/ Windowsネットワークスタックから

に送信されたネットワークパケットをするために使用することができ、ユーザーモードのアプリケーションがドロップ/変更/キャプチャすることができますパケットフィルタ、ファイアウォール、NAT、VPN、トンネリングアプリケーションなどを実装する。

おそらくそれをC#または.NETで使用するかもしれません。

+0

WinDivertを実行するとTCP/IPネットワークの流れをリアルタイムでやり取りするのに役立ち、IOTを検出するためにカスタムフィルタを使用することもできます。ネットワークパケットを生成し、トリガされたときに相対データを読み込み/再構築... –

関連する問題