Самый быстрый способ проверить, прослушивает ли конечная точка 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 и не будет постоянно изменять таймаут для этой службы.