Мониторинг состояния веб-службы c # без использования обработки ошибок - PullRequest
2 голосов
/ 21 января 2010

Есть ли хороший способ проверить, доступен ли веб-сервис, который не включает в себя простой вызов обслуживаемого метода?

То есть я искал что-то вроде метода .TryConnect () или .IsAvailable (), который мог бы вызвать перед вызовом моего метода .TransferData (data).

Я пытался прочитать переменную State службы, но даже когда служба выдает EndpointNotFoundExceptions, она сообщает о себе в состоянии «Открыто», а не «Неисправно», как я надеялся.

Я использую синхронные вызовы данных, и веб-служба реализует IDataTransferService, если это помогает. Также-- .NET 3.5.

Ответы [ 4 ]

4 голосов
/ 21 января 2010

Единственный надежный способ - вызвать метод и повторить попытку в случае сбоя. Независимо от того, какие предварительные проверки вы выполняете, служба может сообщить, что она работает, и отключиться в момент вызова.

3 голосов
/ 21 января 2010

Нет, лучшего способа нет. Просто назовите самый простой WebMethod. Некоторые службы для этой цели более или менее предоставляют фиктивный метод или GetVersion ().

А затем перехватить исключение TimeOut.

0 голосов
/ 21 января 2010

Мы используем кэшированный прокси-клиент в одном из наших проектов. Чтобы гарантировать, что соединение остается активным, мы создали простую операцию Ping в Сервисе. Мы вызываем этот метод каждые x секунд и сообщаем в журнал, если операция Ping не удалась. Вы можете расширить это, чтобы также найти причину сбоя - таймауты или ошибки связи будут указывать на недоступность сервиса Конечно, этот метод возможен только в том случае, если под вашим контролем и служба, и клиент.

0 голосов
/ 21 января 2010

Вы можете попытаться сделать веб-запрос, который проверяет wsdl веб-службы. Это не гарантия, но в большинстве случаев, если служба будет обслуживать wsdl, она также будет выполнять функцию. Вот один из них, который я написал, чтобы проверить базовую доступность службы.

Dim _streamReader As StreamReader
Dim responseString As New StringBuilder()

_streamReader = New StreamReader(Me.Response.GetResponseStream())
responseString.Append(_streamReader.ReadToEnd())
_streamReader.Close()
_streamReader = Nothing

If responseString.ToString().Contains("<wsdl:definitions") AndAlso _
    responseString.ToString().Contains("</wsdl:definitions>") Then
    wsdlVerified = True
Else
    Throw New Exception("The response did not generate valid wsdl.")
End If

Где свойства для этого класса обслуживают код выше:

Public Property Url() As String
    Get
        Return _url.Trim()
    End Get
    Set(ByVal value As String)
        _url = value.Trim()
    End Set
End Property

Public ReadOnly Property Request() As System.Net.HttpWebRequest
    Get
        If _request Is Nothing AndAlso Me.Url.Trim.Length > 0 Then _
            _request = CType(System.Net.HttpWebRequest.Create(Me.Url & "?wsdl"), _
                System.Net.HttpWebRequest)
        Return _request
    End Get
End Property

Public ReadOnly Property Response() As System.Net.HttpWebResponse
    Get
        If _response Is Nothing AndAlso Me.Url.Trim().Length > 0 Then _
            _response = CType(Request.GetResponse(), System.Net.HttpWebResponse)
        Return _response
    End Get
End Property

РЕДАКТИРОВАТЬ: я бы рефакторинг это в C #, но это довольно простой и должен легко переводить

...