wcf channelfactory和opentimeout

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

在客户端中,我试图连接到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)); 
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如果你说的是并发通道创建-是的。我没有任何问题。