web-dev-qa-db-ja.com

常に実行中のサービスとしてのWebSocketクライアント

私たちが統合している会社は、RFIDカードとドアスキャナーを製造するドアセキュリティ会社です。カードをスキャンすると、ドアが開き、中に入ることができます。Webソケットサーバーを介してサードパーティの統合が可能です。彼らは「イベント」をサーバーに投稿します。 「Bob Foobarはドアリーダー#14で2018年2月26日午前8時12分にカードをスキャンしました」すべてjson形式です。これらのイベントを常にリッスンし、データベースに記録する必要があります。

クライアントには2つのオプションがあります。マルチテナントSAAS環境でサービスをクラウドホストします。ただし、必要に応じて、お客様がセルフホストすることもできます。 SAASオプションしかなかった場合、これは単純なソリューションになります。サーバーで実行するWindowsサービスを作成して、WebSocketサーバーにサブスクライブするだけです。ただし、自己ホスト型のお客様には、Windowsサービスのインストールを求めないようにしたいと考えています。これを実現する他の方法を探しています。ただし、ブラウザウィンドウを開いて開いたままにするよう依頼することも望まない。

リモートWebソケットをサブスクライブする必要があります。また、ユーザーとの対話がなくても常にリッスンするようにサブスクライブする必要があります。これは、ユーザー中心のチャットタイプのサービスではありません。イベントはリモートサーバーに表示されるため、常にイベントをリッスンする必要があります。

私はSystem.Net.WebSocketsを読んでいて、多くの例を見てきました。私はWindowsサービスとして概念実証を構築しましたが、それは機能します。

しかし... Windowsサービスは、ユーザーとの対話なしで常にリモートWebSocketサーバーにサブスクライブする唯一の方法ですか?他にどのようなオプションがありますか?そして、IISを使用してこれを厳密に達成することは可能ですか?

1
Casey Crookston

私は3つまたは4つの種類のプロセスがあると思います:

  • ユーザーが開始したアプリケーション
  • ユーザーがログインすると、アプリケーションが自動的に起動します
  • O/Sの起動時、ユーザーがログインする前に開始されたサービス
  • (デバイスドライバ)

プロセスを実行したい場合:

  • ユーザーがログインする前
  • ユーザーがログインした後
  • ユーザーがログアウトした後

...次に、(「ユーザー」)アプリケーションとしてではなく、(「システム」)サービスとして実行する必要があります。

代替案:

  • 既存のサービスのプラグインとして実行します-その場合、プラグインのアーキテクチャと管理(インストールなど)とそのセキュリティコンテキストは、サービス(IISなど)に依存します
  • ユーザーがそれを強制終了できることを気にせず、ユーザーがログインまたはログアウトしたときに起動および停止することを気にしない場合は、ユーザーアプリケーションとして実行します。
2
ChrisW

SAASソリューションまたはクライアントベースのソリューションのいずれかで私が目にする最初の問題は、切断の処理方法です。私はWebSocketのエキスパートではありませんが(遠くはありません)、サブスクリプションを維持するために組み込まれているものはないと思います。私は間違っている可能性がありますが、大まかな検索では何も見つかりませんでした。本当にすべてのメッセージをキャプチャする必要がある場合、クライアントやネットワークのダウンタイムを予想する必要があるため、これは大きな問題です。見逃したメッセージに追いつく方法を考えましたか?これらを少し試してみたところ、接続がひどく安定しておらず、予期せず切断されることがわかりました(少し前のことです:YMMV)。少なくとも、クライアントが自分自身を再確立できることを確認する必要があります。接続が失われた場合。

実行する限り、クライアントアプリケーションを作成する必要があります。それをお客様に提供し、Windowsでサービスとして実行する方法に関する情報を提供します。全体的にはかなり薄っぺらに聞こえますが。何をしようとしているのかではなく、WebSocketに依存する必要があるためです。オンデマンドで情報を取得できる適切なAPIと組み合わせると便利だと思いますが、それだけでは問題が発生すると思います。

1
JimmyJames