【问题标题】:Fastest way to check if WCF endpoint is listening检查 WCF 端点是否正在侦听的最快方法
【发布时间】:2011-07-06 05:53:44
【问题描述】:

通常,如果 WCF 端点不可用(在我的情况下,通常是因为服务主机未运行),我会在超时后收到 EndpointNotFoundException。我想有一种快速的方法来查询服务以查看它是否可用,而不必依赖正常的超时。换句话说,我想在正常情况下保持正常超时,但是为了快速“ping”端点,如果它不能立即可用,我希望它快速失败。

如何做到这一点?

【问题讨论】:

  • 这不是重复的。 other question 是关于 WCF Web 服务的,这个问题更笼统,例如我正在使用NetNamedPipeBinding

标签: c# wcf


【解决方案1】:

您将不得不等待 TimeOut 异常。您可以在创建 Proxy 对象时设置(覆盖)TimeOut。它们很便宜,所以为 Ping 做一个临时代理。

在服务器端,您可以确保有一个轻量级函数可以调用(例如 GetVersion)。

【讨论】:

  • 回到我做WCF的时候,我只是用了void Ping();p
【解决方案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 秒内为您提供服务器状态

【讨论】:

  • 这看起来很有希望。公平地说,我没有提到我的完整配置,但我正在使用端口共享。很高兴在这里有另一种方法。
  • 并发访问时会出现问题,在ForAll Parallel方法上做个测试看看
【解决方案3】:

这是您要更改的SendTimeout。 在我的特殊情况下,它是联邦快递包裹评级服务,顺便说一句,周五晚上似乎总是关闭。您可能需要仔细考虑超时值,具体取决于误报(因此服务关闭)的重要性。

rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5);

此值只会影响 WCF 客户端,不会永久更改该服务的超时时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2022-12-14
    • 2012-04-07
    相关资源
    最近更新 更多