17

.Net では、サービスと対話するための最良の方法は何ですか (つまり、ほとんどのトレイ アプリがサーバーと通信する方法)。この方法がクロスプラットフォームでもあると望ましいでしょう (Mono で動作するので、リモーティングはアウトだと思いますか?)


編集:

言い忘れましたが、フィールドで Windows 2000 マシンをサポートする必要があるため、WCF と .Net 2.0 を超えるものは機能しません。

4

7 に答える 7

18

最終的に Windows Vista または Windows Server 2008 に展開することを計画している場合、現在実行できる多くの方法は機能しないことに注意してください。これは、「セッション 0 アイソレーション」と呼ばれる新しいセキュリティ機能が導入されたためです。

ほとんどの Windows サービスは、システムの残りの部分から適切に分離するために、セッション 0 で実行するように移動されました。これの拡張は、システムにログインする最初のユーザーがセッション #0 ではなく、セッション 1 に配置されることです。したがって、分離により、サービスとデスクトップ アプリケーション間の特定の種類の通信を行うコードが壊れます。

サービスとアプリケーション間の通信を行う際に、Vista および Server 2008 で動作するコードを現在作成する最善の方法は、RPC、名前付きパイプなどの適切なクロスプロセス API を使用することです。SendMessage/PostMessage を使用しないでください。セッション 0 アイソレーションで失敗します。

http://www.microsoft.com/whdc/system/vista/services.mspx

さて、あなたの要件を考えると、あなたは少し窮屈になるでしょう。クロスプラットフォームの問題については、Remoting がサポートされるかどうかはわかりません。ドロップダウンしてソケットに戻る必要がある場合があります: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

于 2008-09-17T18:45:56.513 に答える
4

これがトレイアプリであり、真のサービスではない場合は、パイプまたはTCP/IPを使用する場合の通信の設定方法に注意してください。複数のユーザーがマシン(Citrix、リモートデスクトップ)にログインし、各ユーザーがトレイアプリの「サービス」を起動すると、複数のプロセスが同じ既知のポートまたはパイプを使用しようとする状況に遭遇する可能性があります。もちろん、複数のパイプをサポートする予定がない場合や、各ユーザーシェルで実行されるトレイアプリとは対照的に真のサービスを利用している場合は、これは問題になりません。

于 2008-09-17T18:56:47.317 に答える
3

誰かが実際にMonoでリモーティングを試みましたか?それはうまく機能します。いくつかのコーナーケースにぶつかるかもしれませんが、これはほとんどありません。クロスプラットフォーム(MS.Net <-> Mono)のリモート処理についてアプリケーションをテストするだけで、発生する可能性のあるグリッチをキャッチできます。そして最近のMonoから始めて、2.4.2が最新です。

于 2009-06-26T08:26:11.063 に答える
3

通常の古い TCP ストリーム ソケットを使用して、定義済みのポートで 127.0.0.1 をリッスンするサービスを用意します。デスクトップ アプリケーションからそのポートに接続します。

非常にシンプルで、完全にクロスプラットフォームです。

于 2008-09-17T16:53:06.083 に答える
2

おかしなことに、私はRemotingを提案するつもりでした!Mono 1.0リリースノート(元の場所が欠落しているため、archive.orgから)は、サポートされているライブラリとしてSystem.Runtime.Remoting.dllに言及しており、既知の問題については何も述べていません。

リモーティングが行われていない場合は、おそらく独自のTCPメッセージフレーミングプロトコルを実装する必要があります。Windowsには、同じマシン上で通信するためのUNIXドメインソケットに相当するものはありません。

于 2008-09-17T16:15:06.300 に答える
2

リモート処理はオプションですが、クロスプラットフォームではありません。その他の方法として、名前付きパイプ、IPC、またはカーネル イベントを使用する方法があります。

于 2008-09-17T16:08:41.743 に答える
2

GUI コンポーネントを持つほとんどのサービスは、指定されたユーザーとして実行され、デスクトップへのアクセスが許可されます。これにより、COM または .NET 経由でアクセスできますが、ローカルでのみアクセスできます (複雑になりたくない場合)。

個人的には、サービスで通常の古いソケットを開きます。クロス プラットフォームであり、複数のクライアントを許可し、任意のアプリからのアクセスを許可し、Windows セキュリティに依存せず、任意の言語で GUI を記述できるようにします。好きな言語 (すべてがソケットをサポートしているため)。

トレイ アプリの場合、単純なプロトコルで通信する必要があります。REST スタイルのシステムを使用してコマンドを送信し、XML (yuk) またはカスタム データ形式をストリーミングして戻すこともできます。

于 2008-09-17T16:16:21.850 に答える