服务中断时,WCF客户端会忽略超时值

Mar*_*her 11 .net vb.net wcf wcf-client

我有一个使用WCF的VB .NET应用程序.我已经为代码中的所有内容设置了客户端超时:

    Dim oMastSrv As MastSvc.IclsIOXferClient = Nothing

    Dim binding As New ServiceModel.NetTcpBinding("NetTcpBinding_IclsIOXfer")
    Dim intTimeout As Integer = 2500
    binding.SendTimeout = New TimeSpan(0, 0, 0, 0, intTimeout)
    binding.ReceiveTimeout = New TimeSpan(0, 0, 0, 0, intTimeout)
    binding.OpenTimeout = New TimeSpan(0, 0, 0, 0, intTimeout)
    binding.CloseTimeout = New TimeSpan(0, 0, 0, 0, intTimeout)
    Dim address As New ServiceModel.EndpointAddress("net.tcp://" & GetSrvIP(intSrvID) & ":30000/MyMastSvc")

    oMastSrv = New MastSvc.IclsIOXferClient(binding, address)
    Try
        oMastSrv.ServiceConnect( ... )
        oMastSrv.InnerChannel.OperationTimeout = New TimeSpan(0, 0, 0, 0, intTimeout)
    Catch ex As Exception
        ...
    End Try
Run Code Online (Sandbox Code Playgroud)

但是,当我连接到崩溃的服务时,Endpoint Not Found异常需要花费超过20秒而不是我指定的2.5.这实际上是我的负载平衡,我需要知道服务在2.5秒内消失了.有没有办法在所需的时间跨度内抛出此异常?

BTW,例外情况如下:

无法连接到net.tcp://192.168.227.130:30000/MXIOXfer.连接尝试持续时间跨度为00:00:02.4209684.TCP错误代码10060:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应192.168.227.130:30000.

但它确实需要超过二十秒.我已经打开了WCF跟踪并且可以在异常之前看到TCP操作失败警告并且它具有实时:

无法连接到net.tcp://192.168.227.130:30000/MXIOXfer.连接尝试持续时间跨度为00:00:21.0314092.TCP错误代码10060:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应192.168.227.130:30000.

如果它有任何区别,服务的所有通信都在不同的线程上完成.

编辑:

此线程似乎表明套接字超时由操作系统设置.是否有针对此类事情的注册表设置?

eol*_*eol 1

我相信这篇文章讨论了同一个问题:wcf channelfactory 和 opentimeout

问题是底层套接字有一个默认的 20 秒左右的超时,WCF 不会覆盖该超时。检查最后一个答案,了解通过异步打开来实现自己的超时的方法。