2009-01-28 2 views
1

Итак, у меня есть служба WCF, которая прослушивает как net.tcp, так и net.pipe. Я создал прокси-клиент WCF, и я хотел бы, чтобы он мог подключаться через tcp или named pipe. Я не хочу config в app.config, но в коде.WCF Bindings

Клиент WCF получит адрес конечной точки во время выполнения, что-то вроде «net.tcp: // mymachine: 10001/MyService» или «net.pipe: // localhost/MyService». Я бы подумал, что он просто использует правильный NetTcpBinding или NetNamedPipeBinding, основанный на схеме Uri, но это выглядит не так.

Могу ли я просто настроить прокси-сервер, чтобы использовать или именованные каналы или привязки tcp, и он выберет тот, который основан на адресе конечной точки?

EDIT: Хорошо, так что я нюхать схему и заполнить связывание:

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, не может быть использован для потому что он находится в состоянии «Сбой».

Если вы изменяете привязку к BindingElement и используете NamedPipeTransportBindingElement, TcpTransportBindingElement и т. Д. С CustomBinding, это работает ... но я не уверен, что понимаю, в чем разница.

+0

Краткая дискуссия по теме [Понимание привязок WCF и стека каналов] (http://wcfanswers.blogspot.com/2012/06/understanding-wcf-bindings-and-channel.html). Пройдите это, чтобы понять, какой привязкой следует использовать для какого сценария. –

ответ

3

Нет, вы не можете. В привязке может быть только один транспортный элемент, имеющий более одного, просто не имеет смысла.

Вам нужно будет взглянуть на схему, а затем на основе этого выбрать правильную привязку. Это достаточно просто сделать, используя класс Uri, который будет выполнять синтаксический анализ для вас.

+0

У меня есть работа с * TransportBindingElements и пользовательская привязка, но я смущен относительно того, какая разница между этим и Bindings .... –