【发布时间】:2012-08-07 20:00:31
【问题描述】:
我有一个使用 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。
如果有什么不同,服务的所有通信都在单独的线程上完成。
编辑:
This thread 似乎表明套接字超时是由操作系统设置的。是否有此类事情的注册表设置?
【问题讨论】:
-
该代码示例看起来像是在打开通道后设置了 OperationTimeout。如果将它移到 ServiceConnect() 之前会发生什么?
-
@ErnieL - 同样的事情,就像在之前和之后设置它一样。 After 需要超时才能正常运行,所以这是我留下的。
标签: .net vb.net wcf wcf-client