gpt4 book ai didi

c# - 如何等待 WCF 代理客户端准备好?

转载 作者:行者123 更新时间:2023-11-30 15:38:26 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何让我的 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,不能在打开状态下进行修改。”

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

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

关于c# - 如何等待 WCF 代理客户端准备好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com