【问题标题】:How to wait for WCF proxy client to be ready?如何等待 WCF 代理客户端准备好?
【发布时间】:2015-11-04 03:34:26
【问题描述】:

我正在尝试弄清楚如何让我的 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 的新手,也许我想太多关于 Sockets-esque 的事情,但我希望我的客户继续重试,直到端点可用或可以找到,并以某种方式触发一个连接事件或类似的东西。

【问题讨论】:

  • 无论服务是否启动,都运行测试是否托管服务,并且新服务之后的状态是“创建”的。如果服务已启动,则在第一个方法调用之后(但不是之前),它的状态为 Open。​​
  • 我也注意到如果在_proxy.Open()之前设置断点,查看_proxy的内部成员然后让代码继续运行Open,最后会返回InvalidOperationException。看起来这是因为调试器评估了一些会导致副作用的属性。

标签: c# .net wcf


【解决方案1】:

使用 EndpointNotFoundException,您可能会看到类似于“没有端点正在侦听...”的消息。发生的情况是,在您的 while 循环中,您在第一次通过时打开代理,处理错误,然后在第二次通过时您会收到 InvalidOperationException,它说:“通信对象 System.ServiceModel.Channels.ServiceChannel 不能在 Opened 状态下进行修改。”

如果您中止现有代理上的连接,您将无法使用它进行后续通信。关闭连接后,代理对象将被丢弃。解决方案是关闭现有代理并创建一个新代理。我在下面更新了您的代码:

_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);
}

【讨论】:

  • 感谢您的澄清!一个注意事项是我必须更改 _proxy.Close();到 _proxy.Abort();否则它会给我一个关于无法更改状态的例外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多