2009-01-28 73 views
1

因此,我有一個在net.tcp和net.pipe上監聽的WCF服務。我已經生成了一個WCF代理客戶端,我希望它能夠通過tcp或命名管道進行連接。我不想在app.config中配置,但在代碼中。WCF綁定

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,不能用於溝通,因爲它處於故障狀態。「

如果更改綁定到BindingElement,並使用CustomBinding使用NamedPipeTransportBindingElement,TcpTransportBindingElement等,但它可以工作......但我不確定我明白它們有什麼不同。

+0

關於主題[理解WCF綁定和通道棧]的簡要討論(http://wcfanswers.blogspot.com/2012/06/understanding-wcf-bindings-and-channel.html)。通過這個來了解哪個綁定應該用於哪個場景。 – 2012-06-24 08:51:05

回答

3

不,你不能。綁定中只能有一個傳輸元素,如果有多個元素就沒有意義。

您將不得不看看該方案,然後根據該方案選擇正確的綁定。這很簡單,使用Uri類,它將爲您執行解析。

+0

我已經得到它與* TransportBindingElements和一個自定義綁定的工作,但我很困惑,這和Bindings之間的區別是什麼.... – 2009-01-28 20:40:44