WCF でカスタムシリアライザーを実装した人はいますか? WCF の既定のシリアライザーをカスタム シリアライザーに置き換えたい理由は、同じ wcf プロキシ クライアントからさまざまなサービスを呼び出すためです。
2 に答える
最近行ったプロジェクトで同様のことをしました。
ただし、2 つの異なる WCF クライアントがありました。どのように「切り替え」たのかというと、クライアント間の共有インターフェイスを作成し、 を使用しServiceLocator
てIClient
.
これは理にかなっていますか?
私が問題を正しく理解していれば、いくつかの基準に基づいて同じインターフェースを使用する 2 つのサービスのうちの 1 つと通信したいアプリケーションがあります。サービスの構成は異なるため、同じ構成を再利用することはできません。
これに取り組むために、アプリケーション構成で 2 つの構成をセットアップします。必要に応じて、コードで行うこともできます。
<client>
<endpoint address="http://service1"
binding="basicHttpBinding"
bindingConfiguration="Service1Binding"
behaviorConfiguration="Service1Behavior"
contract="IServiceInterface, Service"
name="Service1"/>
<endpoint address="http://service2"
binding="basicHttpBinding"
bindingConfiguration="Service2Binding"
behaviorConfiguration="Service2Behavior"
contract="IServiceInterface, Service"
name="Service2"/>
</client>
コードでは、どのサービスと対話するかを決定するために、ある種の条件ステートメントが必要です。これが完了したらChannelFactory
、必要な構成の を作成できます。
string serviceName = FullMoon ? "Service1" : "Service2";
var channelFactory = new ChannelFactory<IServiceInterface>(serviceName);
var proxy = channelFactory.CreateChannel();
proxy.SomeServiceCall();
channelFactory.Close();
プロキシを挿入するために IoC を使用している場合は、おそらくこれを何らかのファクトリにプッシュする必要があります。ChannelFactory の作成は高価な部分であるため、これを最適化することも検討できます。コントラクトだけで構成を指定せずに Factory を作成することは可能です。その後、チャネルを作成するときにバインディングとエンドポイントを指定する必要があります。