在不使用错误处理的情况下监视c#Web服务的状态

时间:2010-01-21 19:05:58

标签: c# web-services monitoring

是否有一种很好的方法可以检查是否有可用的网络服务只是简单地调用服务方法?

也就是说,我正在寻找类似.TryConnect()或.IsAvailable()方法的东西,我可以在调用我的.TransferData(数据)方法之前调用它。

我已经尝试过读取服务的State变量,但即使服务正在抛出EndpointNotFoundExceptions,它也会报告自己处于“已打开”状态,而不是像我希望的那样“故障”。

我正在使用同步数据调用,如果有帮助,Web服务会实现IDataTransferService。另外--.NET 3.5。

4 个答案:

答案 0 :(得分:4)

唯一可靠的方法是实际调用方法并在失败时重试。无论您做什么初步检查,服务都可以报告它正在运行并在您调用它时离线。

答案 1 :(得分:3)

不,没有更好的方法。只需调用最简单的WebMethod即可。有些服务为此提供了或多或少的虚拟方法或GetVersion()。

然后捕获TimeOut异常。

答案 2 :(得分:0)

您可以尝试创建一个检查Web服务的wsdl的WebRequest。这不是保证,但在大多数情况下,如果服务将服务于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#,但它相当基础,应该很容易翻译。

答案 3 :(得分:0)

我们在其中一个项目中使用了缓存代理客户端。为了保证连接保持活动,我们在服务中创建了一个简单的Ping操作。我们每隔x秒调用此方法,并在日志中报告Ping操作是否失败。您可以展开此选项以查找失败的原因 - 超时或通信错误将指示服务不可用。当然,只有当您同时拥有服务和客户端时,才能使用此方法。