8

Web アプリケーションのスケーラビリティを維持するために、データ サービスのみに WCF を使用しています (つまり、アプリケーションの内部で、セッション状態のない非常に無駄のないものなど)。

現在常に渡されているすべてのサービス呼び出しに対して、いくつかの共通プロパティを提供する必要があります。すべての呼び出しに対して単一の要求オブジェクトを持つことは、これらの共通のプロパティを超えて理想的ではありません。残りは非常に多様であり、開発中に頻繁に変更されます。

現時点では、カスタム ヘッダーと clientmessageinspector を使用して値を設定することを検討しています。これは、このシナリオで推奨される最も単純なアプローチですか、それともより良いアプローチがありますか?

もっと詳しく..

以下の赤い点は、正しいアプローチ (またはその方法) がわからない場所です。

ここに画像の説明を入力

送られてくるもの

送信されるデータは単純な ID のセット (userid、clientid などの 3 または 4) です。これらの ID はすべて、セキュリティとパフォーマンスに影響を与えます (場合によっては、どのデータベースに移動するかを決定します)。

また、これを拡張して、より複雑な権限を持たせる予定です - Windows ワーカーには必要ありません。

呼び出し元は、これらがセッション オブジェクトから取得される Web アプリケーションか、これらが手動で入力される Windows サービス ワーカーのいずれかになります。

現在の考え方

理想的には、呼び出し元のワークフローの getinstance は、セッション オブジェクトを使用してこれらのプロパティを自動的に設定するか、Windows サービス呼び出しを使用して手動で設定します (別のコンストラクターですか?)。

次に、これらのパラメーターが、それを呼び出す各関数でコントラクトを構築するために、コード全体で何も考えずに、または一定の参照なしで常に使用できるようにします。現在、多くのサービス コールが発生しています (アプリケーションのスケールや複雑さによるものであり、エンジニアリングの悪さによるものではありません :))。そのため、これが複雑なパーミッションに拡張されているため、自己文書化された方法でルールを適用することが少し難しくなっています。

概念的には、セッションはアプリでこれを処理する場所ですが、サービスは実際には単なるデータ アクセス レイヤー (ビュー マッピング、ページング、およびリポジトリ呼び出しからの最終呼び出しセキュリティ) であるため、そのような繰り返しは必要ありません。または複雑さ、クエリに含める主要なアイデンティティと許可フィールドのみ。

問題

これは、常にこれらのフィールドが必要なため、呼び出しのヘッダーで行うべきことのように感じますが、set と get がエンドポイントとクライアント インターフェイスのライフサイクルのどこに位置する必要があるかについては、少し確信が持てません。それについて間違っていることもうれしいです。

4

3 に答える 3

1

私は同様のアーキテクチャを適用しました。基本的に、すべてのクライアント呼び出しは、選択するDB、識別子などに関する情報を伝達する必要があります。サーバー側では、これらのパラメーターは自動的に処理され、辞書に保存されます。

各サービス呼び出しに関連するヘッダーを追加するために、クライアントプロキシをラップする汎用プロキシクラスを作成しました。サービスを呼び出す必要があるすべての開発者は、呼び出しでこの汎用プロキシクラスを使用しました。

DispatchMessageInspectorサービス側では、データがリクエストヘッダーから抽出され、ディクショナリに格納されるエンドポイント動作としてを実装しました。ディクショナリは、OperationContext()の拡張機能内で初期化IExtension<OperationContext>され、要求処理中に使用できます。

サービスのインスタンスコンテキストモードは。であることに注意してくださいPerCall

于 2013-01-24T15:01:34.907 に答える
1

これは古いアプローチかもしれませんが、からCallContextSystem.Runtime.Remoting.Messagingを簡単に活用できます。クライアントは、の実装を使用IClientMessageInspectorして操作呼び出しの呼び出しコンテキストを設定IMessageInspectorし、サーバーの実装を使用してから共有データを取得できますCallContext

于 2013-01-23T17:32:30.633 に答える