1

2 つのエンドポイント (epA & epB) を持つ単一の WCF サービスによって実装された 2 つのコントラクト (cA & cB) があります。

これはセキュリティ上の理由によるものではありませんが、純粋に明確性/組織化の理由から、endpointA を介してサービスを発見したときにのみ ContractA の操作を「確認」したいと考えています。同様に、endpointB を介した ContractB の操作のみが表示されます。

これらの操作自体を「保護」する必要はありません。シナリオは、特定のクライアントがサービスの一方の「サイド」のみを必要とし、両方を必要としないようなものです (ただし、操作自体がリソースを共有するため、2 つのサービスではなく 1 つのサービスを使用する方が理にかなっています)。

特定のサービスは基本的に 1 つの WSDL を取得するため、すべての操作がすべてのエンドポイントに公開されるようです。それが機能する方法ですか、それともエンドポイント契約で定義されていない操作を遮断することによってエンドポイントを「形成」する方法はありますか?

4

2 に答える 2

1

デフォルトでは、そのとおりです。1 つのサービス実装クラスは、このサービス クラスが実装する (すべてのサービス コントラクトからの) すべてのサービス メソッドを含む 1 つの WSDL を取得します。

(私が知る限り) WSDL を (簡単な) 方法で「形成」する方法はありません。WCF は WSDL を作成するプロセスに入る方法を (静的または動的に) 提供していますが、それらは目的ではありません。気の弱い人。サービス コントラクトの実装を 2 つの別個のクラスに分割するだけで、2 つの別個のサービス、別個の WSDL およびすべてを作成する方がはるかに簡単です。

于 2010-10-02T21:13:32.803 に答える
1

マークは絶対に正しいです。これがWCFで発生する理由を追加しているだけです。WCF では、すべてのメタデータ関連機能は、サービス メタデータの動作と mex エンドポイントに基づいています。これらの機能は両方とも、サービス レベルで定義されます。そのため、(多くのカスタム コードを記述しない限り) 粒度を上げて、エンドポイントごとにメタデータを指定することはできません。

WCF サービス (クラス) は wsdl:service 要素に直接マップされ、各コントラクトを個別の wsdl:port (WCF ではエンドポイントと呼ばれます) として公開します。これがあなたの質問に答える上での主なポイントです。その wsdl:service に 2 番目のコントラクトが必要ない場合は、同じクラスに実装できません。

サービス契約はリソースを共有するとおっしゃいました。その場合、WCF サービスにはビジネス ロジックも含まれている可能性があります。それがあなたの問題の理由です。WCF サービスを実装するための適切な設計は、個別のビジネス ロジック クラスのラッパーとしてのみ作成することです。

于 2010-10-03T13:14:28.013 に答える