したがって、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 などを使用すると動作しますが、違いが何であるかわかりません。