我有一个使用 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
但是,当我连接到的服务崩溃时,Endpoint Not Found 异常需要超过 20 秒才能被抛出,而不是我指定的 2.5。这对我的负载平衡来说真的很糟糕,我需要知道服务在 2.5 秒内消失。有没有办法让这个异常在所需的时间范围内抛出?
顺便说一句,异常内容如下:
无法连接到 net.tcp://192.168.227.130:30000/MXIOXfer。连接尝试持续了 00:00:02.4209684 的时间跨度。TCP错误码10060:连接尝试失败,因为连接的一方在一段时间后没有正确响应,或者连接的主机没有响应192.168.227.130:30000,建立连接失败。
但它确实需要超过 20 秒。我已经打开了 WCF 跟踪,并且可以在异常之前看到 TCP 操作失败警告,并且它具有实时时间:
无法连接到 net.tcp://192.168.227.130:30000/MXIOXfer。连接尝试持续了 00:00:21.0314092 的时间跨度。TCP错误码10060:连接尝试失败,因为连接的一方在一段时间后没有正确响应,或者连接的主机没有响应192.168.227.130:30000,建立连接失败。
如果有任何区别,服务的所有通信都在单独的线程上完成。
编辑:
该线程似乎表明套接字超时是由操作系统设置的。是否有此类事情的注册表设置?