Самый быстрый способ проверить, прослушивает ли конечная точка WCF
Часто, если конечная точка WCF недоступна (в моем случае, обычно, поскольку хост службы не запущен), я получу исключение EndpointNotFoundException после таймаута. Я хотел бы иметь быстрый способ запросить сервис, чтобы узнать, доступен ли он, не полагаясь на обычный тайм-аут. Другими словами, я хочу сохранить нормальный тайм-аут для нормальных обстоятельств, но для быстрого "пинга" конечной точки я хочу, чтобы он быстро провалился, если он недоступен сразу.
Как это можно сделать?
Ответы
Ответ 1
Вам придется подождать исключения TimeOut. Вы можете установить (переопределить) TimeOut при создании объекта Proxy. Они дешевые, поэтому сделайте временный прокси-сервер для Ping.
На стороне сервера вы можете убедиться, что есть легкая функция для вызова (например, GetVersion).
Ответ 2
Чтобы проверить доступность, вы можете попробовать подключиться к хосту через Socket Connection
(его код vb.net 2.0 должен работать и в WCF)
Dim sckTemp As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
sckTemp.ReceiveTimeout = 500 : sckTemp.SendTimeout = 500
Try
'' Connect using a timeout (1/2 second)
Dim result As IAsyncResult = sckTemp.BeginConnect("Host_ADDRESS", YOUR_SERVER_PORT_HERE, Nothing, Nothing)
Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True)
If (Not success) Then
sckTemp.Close() : Return False
Else
Return True
End If
Catch ex As Exception
Return False
End Try
Он даст вам статус сервера за 1/2 секунды
Ответ 3
Это SendTimeout
, которое вы хотите изменить.
В моем конкретном случае это служба оценки пакетов FedEx, которая, кстати, всегда, похоже, не работает в пятницу вечером. Вероятно, вам придется тщательно учитывать значение тайм-аута в зависимости от того, насколько важны ложные негативы (так что служба работает).
rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5);
Это значение просто повлияет на клиента WCF и не будет постоянно изменять таймаут для этой службы.