通常,如果WCF端点不可用(在我的情况下,通常是因为服务主机没有运行),我会在超时后收到EndpointNotFoundException。我想有一个快速的方法来查询服务,看看它是否可用,而不必依赖正常的超时。换句话说,我希望在正常情况下保持正常超时,但是为了快速“ping”端点,我希望它在没有立即可用的情况下快速失败。
如何实现这一目标?
答案 0 :(得分:9)
您必须等待TimeOut异常。您可以在创建Proxy对象时设置(覆盖)TimeOut。它们便宜,所以为Ping做一个临时代理。
在服务器端,您可以确保有一个轻量级函数可以调用(如GetVersion)。
答案 1 :(得分:4)
要检查可用性,您可以尝试通过套接字连接连接到主机 像这样(它的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秒内为您提供服务器状态
答案 2 :(得分:2)
这是你要改变的SendTimeout
。
在我的特殊情况下,这是一个联邦快递包裹评级服务,顺便说一下,似乎总是在周五晚上下来。您可能需要仔细考虑超时值,具体取决于漏报的重要程度(因此服务已关闭)。
rateService.Endpoint.Binding.SendTimeout = TimeSpan.FromSeconds(.5);
此值只会影响WCF客户端,并且不会永久更改该服务的超时。