wcf channelfactory和opentimeout
在客户端中,我试图连接到WCF,将wcf channelfactory和opentimeout,wcf,Wcf,在客户端中,我试图连接到WCF,将OpenTimeout属性更改为5秒,但它不工作。。。。以下是我创建频道的方式: NetTcpBinding bind = new NetTcpBinding(SecurityMode.None); bind.OpenTimeout = new TimeSpan(0, 0, 5); var channel = new ChannelFactory<IService>(bind, new EndpointAddress(myAddr)); chann
OpenTimeout
属性更改为5秒,但它不工作。。。。以下是我创建频道的方式:
NetTcpBinding bind = new NetTcpBinding(SecurityMode.None);
bind.OpenTimeout = new TimeSpan(0, 0, 5);
var channel = new ChannelFactory<IService>(bind, new EndpointAddress(myAddr));
channel.CreateChannel();
NetTcpBinding=newnettcpbinding(SecurityMode.None);
bind.OpenTimeout=newtimespan(0,0,5);
var channel=newchannelfactory(绑定,新端点地址(myAddr));
channel.CreateChannel();
在此之后,我将调用该方法,但如果服务器不在,则需要21秒,而不是我在OpenTimeout
上更改的5秒,我是否遗漏了什么
Tks似乎WCF还做了其他一些事情,这些事情没有计入opentimeout。看这根线 [编辑]
当我在.Net 4.0中尝试此操作时,当wcf服务不可用时,会在2秒内发生超时。Opentimeout没有影响。如果wcf服务可用,但由于任何原因没有响应,您可以通过在绑定上设置sendtimeout设置,让客户端等待您想要的时间。我找到的解决方案是检查wcf服务器是否已启动(在调用该方法之前),如下所示:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.ReceiveTimeout = sock.SendTimeout = 500;
IAsyncResult res = sock.BeginConnect(ip, port, null, null);
bool success = res.AsyncWaitHandle.WaitOne(500, true);
我用另一种方法解决了这个问题。这似乎是个好办法
protected TServiceContract CreateChannel()
{
TServiceContract channel = factory.CreateChannel();
var ar = ((IChannel)channel).BeginOpen( null, null );
if( !ar.AsyncWaitHandle.WaitOne( factory.Endpoint.Binding.OpenTimeout, true ) )
{
throw new TimeoutException( "Service is not available" );
}
((IChannel)channel).EndOpen( ar );
return channel;
}
对服务上的方法的第一次调用也会打开通道。这被称为自动打开,它是。相反,您应该明确地将其称为:
channel.Open();
channel.RetrieveFoobars();
但是,问题仍然存在:channel.Open()不考虑绑定的OpenTimeout,而是在抛出EndpointNotFoundException之前等待大约21秒。我猜这是WCF通信对象中的一个bug
使用上述代码,设置((IContextChannel)通道).OperationTimeout
,bind.SendTimeout
,或bind.OpenTimeout
,没有帮助。(如其他地方所述)
基于此,我确定的解决方案是使用异步方法,它允许您指定在取消之前等待多长时间
private void CloseChannel(ICommunicationObject channel){
try {
channel.Close();
} catch {
channel.Abort();
}
}
private void OpenChannel(ICommunicationObject channel, TimeSpan timeout) {
var ar = channel.BeginOpen(null, null);
if (!ar.AsyncWaitHandle.WaitOne(timeout, true)) {
CloseChannel(channel);
throw new EndpointNotFoundException();
}
channel.EndOpen(ar);
}
您仍然必须首先将绑定的OpenTimeout设置为至少50ms,否则BeginOpen会抛出TimeoutException
bind.OpenTimeout = TimeSpan.FromMilliseconds(100d)
如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以很好地格式化和语法突出显示它!对不起,马克,我真的很抱歉forgot@Alexandre你找到这个问题的解决方案了吗,因为我面临着同样的问题这个解决方案的问题是并发访问…如果发生了,有时套接字会返回false如果你说的是并发通道创建-是的。我没有任何问题。