2012-07-12 56 views
3

我想弄清楚如何让我的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的新手,也许我正在考虑太多的东西是套接字式的,但我希望我的客户端继续重试,直到端点变得可用或可以找到,并以某种方式发起关联事件或沿着这些线路发生的事情。

+0

运行服务托管或不托管测试,以及新建“后创建”的状态,无论服务是否启动。如果服务处于启动状态,则在第一次方法调用后(但不是在此之前),它的状态为“打开”。 – Paparazzi 2012-07-12 17:43:25

+0

我也注意到,如果你在_proxy.Open()之前设置断点,看看_proxy的内部成员,然后允许代码继续并运行Open,最后将返回InvalidOperationException。看起来这是因为调试器评估了一些导致副作用的属性。 – Monsignor 2014-01-10 11:50:59

回答

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); 
} 
+0

谢谢您的澄清!一个注意,但我不得不改变_proxy.Close(); to _proxy.Abort();否则它会给我一个关于无法改变状态的例外。 – JamesK89 2012-07-12 18:12:50

+0

很高兴听到它帮助!我相应地更新了我的答案。 – 2012-07-12 18:36:21

+0

现在即时通知此异常 – skhurams 2016-01-01 14:29:05