1

したがって、net.tcp と net.pipe の両方でリッスンしている WCF サービスがあります。WCF プロキシ クライアントを生成しましたが、tcp または名前付きパイプ経由で接続できるようにしたいと考えています。app.config ではなく、コードで設定したいのです。

WCF クライアントは実行時にエンドポイント アドレスを取得するため、"net.tcp://mymachine:10001/MyService" または "net.pipe://localhost/MyService" のようになります。Uri スキームに基づいて正しい NetTcpBinding または NetNamedPipeBinding を使用するだけだと思いますが、そのようには見えません。

名前付きパイプまたは tcp バインディングのいずれかを取るようにプロキシを設定することはできませんか?エンドポイント アドレスに基づいてプロキシが選択します。

編集:さて、スキームを盗聴し、バインディングを設定します。

var uri = new Uri("net.tcp://localhost:10001/MyService");
Binding b;
if (uri.Scheme == Uri.UriSchemeNetPipe) {
    b = new NetNamedPipeBinding();
} else if (uri.Scheme == Uri.UriSchemeNetTcp) {
    b = new NetTcpBinding();
} else if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) {
    b = new WSHttpBinding();
}

var proxy = new ClientProxy(b, new EndpointAddress(uri));

しかし、接続エラーが発生します - 「通信オブジェクト System.ServiceModel.Channels.ServiceChannel は、Faulted 状態であるため通信に使用できません。」

Binding を BindingElement に変更し、CustomBinding で NamedPipeTransportBindingElement、TcpTransportBindingElement などを使用すると動作しますが、違いが何であるかわかりません。

4

1 に答える 1

3

いいえ、できません。バインディングには 1 つのトランスポート要素しか存在できません。複数のトランスポート要素を使用しても意味がありません。

スキームを見て、それに基づいて正しいバインディングを選択する必要があります。解析を実行する Uri クラスを使用すると、簡単に実行できます。

于 2009-01-28T18:04:58.307 に答える