2

私はプロトタイプのWCF対応分散アプリを作成しています。これは、既存の「通信するためにtcpを介してxmlを送信する」アプリをアップグレードする際に発生する問題を見つけるためです。私はコールバックコントラクトを使用してクライアントをサーバー(ServiceHostのシングルトン)に登録していますが、これまでのところ、クライアントとサーバー間のすべての通信が機能しています。複数のクライアントをサーバーに接続し、すべてのクライアントが受信するサーバーからブロードキャストを送信できます。特定のクライアントをブロックできますが、他のクライアントは引き続き呼び出しを受信します。これはいい。

パフォーマンスの学習と評価を続けるために、サーバーが各メッセージを送信する時刻と、クライアントが同じメッセージを受信する時刻をクライアントに記録してもらいたいと思います。これについてはどうすればよいですか?

サーバーからの送信とクライアントへの受信に追加できるSOAP拡張機能に似たものはありますか?または、サーバーがクライアントで呼び出すすべてのメソッドに「timeSent」パラメーターを追加し、クライアントで受信した時間を記録する必要がありますか(うん!)?これを達成するためのより良い方法はありますか?

wsDualHttpBindingではなくnet.tcpを使用しています(これも機能しますが、パフォーマンスは低下します)。

4

2 に答える 2

2

うーん・・・難しいですね。ここでの問題は、クライアントとサーバーの両方のタイマーが同期していることを確認することさえできないことです。

メソッドを変更する必要がないように帯域外データを送信したい場合は、ここで提案されている方法を使用できます。それで十分だと思います。

于 2008-10-02T00:26:58.523 に答える
1

David は、クロック同期の問題については正しいです。ただし、サービス/クライアントの実装の外部にタイムスタンプ情報を追加することは、WCF ではまったく難しくありません。

確かに SoapExtensions はサポートされていませんが、実際には、はるかに豊富な拡張ポイントがあります。あなたの特定のケースでは、 MessageInspector を追加するカスタム動作がおそらく機能すると思います。

実際には 2 つのメッセージ インスペクター インターフェイスがあります。1 つはクライアント用 ( IClientMessageInspector ) で、もう 1 つはサーバー用 ( IDispatchMessageInspector ) です。

サービス側でディスパッチ インスペクタをフックする最も簡単な方法は、サービス ビヘイビア (IServiceBehavior) を使用することです。これは、カスタム属性としてサービス実装にフックできるためです。これを行う方法の簡単な例を次に示します。IEndpointBehavior を介して接続することもできますが、サービス ホストをセットアップするときにコードを使用するか、構成を介して行う必要があります。これには、もう少しコードを記述する必要があります。

クライアント側では、引き続きエンドポイント ビヘイビアーを使用しますが、プロキシ クライアントから ClientRuntime に直接アクセスできるため、コードを介してそれらを導入する方がはるかに簡単です。

とにかく、タイムスタンプのようなものをカスタムヘッダーとしてメッセージに追加して、メッセージペイロードの直接の一部にならないようにすることをお勧めします。

于 2008-10-02T12:50:27.643 に答える