所以,我有一个正在监听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等,则可以正常工作......但我不确定我是否理解其中的区别。
答案 0 :(得分:3)
您必须查看该方案,然后根据该方案选择正确的绑定。这很简单,使用Uri类,它将为你执行解析。