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
ただし、接続しているサービスがクラッシュすると、指定した 2.5 ではなく、Endpoint Not Found 例外がスローされるまでに 20 秒以上かかります。これは私のロード バランシングを本当にいじっています。サービスが 2.5 秒以内になくなったことを知る必要があります。この例外を目的の期間内にスローする方法はありますか?
ところで、例外は次のようになります。
net.tcp://192.168.227.130:30000/MXIOXfer に接続できませんでした。接続の試行は、00:00:02.4209684 の期間継続しました。TCP エラー コード 10060: 接続先が一定時間後に適切に応答しなかったため、接続の試行に失敗したか、接続されたホストが 192.168.227.130:30000 に応答しなかったために確立された接続が失敗しました。
しかし、実際には 20 秒以上かかります。WCF トレースをオンにすると、例外の直前に TCP 操作が失敗したという警告が表示され、REAL 時間が表示されます。
net.tcp://192.168.227.130:30000/MXIOXfer に接続できませんでした。接続の試行は、00:00:21.0314092 の期間継続しました。TCP エラー コード 10060: 接続先が一定時間後に適切に応答しなかったため、接続の試行に失敗したか、接続されたホストが 192.168.227.130:30000 に応答しなかったために確立された接続が失敗しました。
違いがある場合、サービスへのすべての通信は別のスレッドで行われます。
編集:
このスレッドは、ソケットのタイムアウトがオペレーティング システムによって設定されていることを示しているようです。そのようなもののためのレジストリ設定はありますか?