如何等待WCF代理客户端准备就绪



我正试图弄清楚如何让我的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的新手,可能我想得太多了套接字式的东西,但我希望我的客户端继续重试,直到端点可用或可以找到为止,并以某种方式启动一个连接上的事件或类似的东西。

使用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);
}

最新更新