我正在试图弄清楚如何让我的WCF代理类在继续之前等待准备好,或允许调用该服务。
我试过这样的事情:
_proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack"));
while(!_proxy.State.Equals(CommunicationState.Opened)) {
if(!_proxy.State.Equals(CommunicationState.Opening)) {
try {
_proxy.Open();
} catch(EndpointNotFoundException enfe) {
/* ... */
}
}
System.Threading.Thread.Sleep(1);
}
但显然这不起作用,否则我不会在这里。起初它似乎工作但ChannelFactory在open语句上抛出InvalidOperationException。
我是WCF的新手,也许我正在考虑套接字式的东西,但我希望我的客户端继续重试,直到端点可用或可以找到,并以某种方式触发一个相关的事件或类似的东西。
答案 0 :(得分:4)
使用EndpointNotFoundException,您可能会看到类似“没有端点正在侦听......”的消息。发生的事情是,在你的while循环中,你在第一遍打开代理,处理错误,然后在第二遍你得到InvalidOperationException,说“通信对象,System.ServiceModel.Channels.ServiceChannel,不能在处于打开状态时进行修改。“
如果您中止现有代理上的连接,您将无法使用它进行通信。关闭连接后,将丢弃代理对象。解决方案是关闭现有代理并创建一个新代理。我已在下面更新了您的代码:
_proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack"));
while(!_proxy.State.Equals(CommunicationState.Opened)) {
if(!_proxy.State.Equals(CommunicationState.Opening)) {
try {
_proxy.Open();
} catch(EndpointNotFoundException enfe) {
/* ... */
_proxy.Abort();
_proxy = new WCFBlackjack(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/blackjack/IWCFBlackjack"));
}
}
System.Threading.Thread.Sleep(1);
}