2

私が持っているシナリオを適切なコードで処理する方法がよくわかりません。

私の仕事の基準の基本はこれです:

  • WCF サービスを使用する WPF アプリケーション
  • サービスはセッションごとのインスタンス化を使用します
  • セッションはアプリケーションの開始直後に開始され、アプリケーションの存続期間中存続する必要があります (わずかな例外があります)。
  • セッション内の一部のメソッド呼び出しは、他のメソッド呼び出しより先に終了する必要があります

これは、アプリケーション全体でプロキシ クライアントのインスタンスを 1 つ持つことができる必要があることを意味します。また、非同期呼び出しを処理できるようにする必要があるため、クライアントがハングアップすることはありませんが、同時にそれらが確実に終了するようにします。

私の技術的な理解では、特定のシナリオが意図したとおりに機能するかどうかわからないほど WCF が制限されています。だから私は私の不確実性をリストするつもりです:

  • セッションはいつ開始し、いつ終了しますか。クライアントの作成に基づいていますか、それとも最初のセッションで障害が発生した場合、別のクライアント インスタンスが同じセッションにアクセスできますか。
  • WCF サービスを介して例外を処理する最良の方法は何ですか?
  • ChannelFactory は、私がここに置くのを助けるために私が見るべきものですか?

そこで、これらの問題のいくつかを解決するために最初の反復で行ったこと。

  • 依存性注入を使用して、WPF アプリケーション (私は MVVM を使用しています) のクラス全体にクライアント インスタンスを注入し、同じインスタンスがどこにでも存在するようにしました。
  • 非同期生成メソッドを使用してサービス参照を作成し、すべてのメソッドの Begin バージョンと End バージョンを取得して、呼び出しが非同期になるようにしました。
  • 私は、Caliburn.Micro フレームワークのコルーチン (IResult インターフェイス) 機能を使用して、1 つの非同期アクションが他のアクションが開始される前に終了するようにしました (これが適切な使用法なのか、それともスマートな動きなのかまったくわかりません)。

私がまだ抱えている問題は、もちろん、クライアントの障害状態を処理する方法です。私は今、クライアントを再インスタンス化し、セッションを救出するか、実際にそのまま再セットアップできると想定しています。同じ新しいインスタンスを挿入したすべての場所で再インスタンス化する必要があります。

したがって、クライアントをラップする ClientManager クラスを作成するのがおそらく最善でしょう。そうすれば、この ClientManager を注入し、必要に応じてその内部で再インスタンス化できます。メソッド呼び出しを行えるように彼を外部に公開する必要があると思いますが、何らかの方法で彼の内部でエラー処理を行うことができれば素晴らしいと思います。私は自分のメソッドをテストするのに苦労しています.WCF、コルーチン、およびスレッドの内部動作のすべてを理解していないため、統合で適切に機能するかどうかはわかりません.

これらの問題で私よりも経験豊富な人がいて、いくつかの指針を教えてくれるか、少なくともこれらの状況で (セッションごとに) WCF がどのように機能するか、および私が間違っていることと正しいことを教えてくれますか?

4

1 に答える 1

1

WCF はすぐに使用できるセッションをサポートしているため、このMSDN の記事から始めることをお勧めします。

非常に高いレベルで、最初SessionMode=SessionMode.RequiredServiceContract. 次に、OperationContract のプロパティIsInitiating=Trueとプロパティを設定して、各セッションの開始と終了をマークします。IsTerminating=True

ただし、WCF はDOS 攻撃を防ぐためにデフォルトで同時セッション数を16に制限していますが、値はいつでも増やすことができます。また、セッションのホスト (IIS / Windows サービス / その他) がリサイクルされない限り、セッションは有効であることに気付いたでしょう。

関連する注意事項として、私は以前にWCF Durable Servicesを使用しました。これは、WCF サービスの状態をデータ ストアに永続化することを目的としています (デフォルトは SQL Server です)。もちろん、ここにはパフォーマンス ヒットがあります。これがあなたにとって正しい選択であるかどうかを確認するために、さらに読むことをお勧めします.

お役に立てれば。

于 2012-07-30T16:42:29.480 に答える