我将使用代理服务器的客户端应用程序。该客户端将是一个Windows表单应用程序,它通过一个地址为N个端点执行basicHttpBinding。
我想要解决的问题是,当任何窗体形成应用程序通过互联网获取必须让我的网络服务器在线的网络服务器时,需要知道这个特定的WCF服务是在线的。我需要一个示例,说明后台线程上的这个客户端如何能够仅轮询“WCF服务..,你在吗?”通过这种方式,我们的客户端应用程序可以在他们投入大量时间构建客户端工作之前通知客户端,但只会因WCF服务脱机而感到沮丧。
我正在寻找一种简单的方法来检查WCF服务“你在吗?”
答案 0 :(得分:11)
这种对于检查这些服务是否存在的痴迷?
只需致电该服务,任何防御性编程课程都会教你,准备好处理异常。
不断发送“你在吗?”真的没有任何好处。请求全线...
即使您可以使用Ping()
方法(只返回固定值或其他内容 - 您的服务名称或其他内容) - 只检查您的服务是否可访问 - 您需要的数据库是什么查询从中获取数据?您的服务方法依赖于其他服务怎么样?找出一种检查所有方法的方法非常麻烦,非常棘手 - 只是为了看看它是否存在。
简而言之:不,没有可靠而有意义的方法来检查某个服务是否“存在”和“活着” - 只需调用它!并准备好应对失败 - 有时会失败......
答案 1 :(得分:5)
检查服务是否存在没有价值。绝对没有。为什么呢?
if(serviceIsAlive())
{
callService();
}
else
{
handleFailure()
}
您是否看到此代码段存在问题?如果在您检查服务是否处于活动状态与调用服务的时间之间,服务会中断,会发生什么?这是竞争条件,等待发生的错误。因此,即使您可以检查服务条件,您需要做的是:
if(serviceIsAlive())
{
try
{
callService();
}
catch(CommunicationException)
{
handleFailure();
}
}
else
{
handleFailure();
}
但是在这个块中,handleFailure()调用在两个不同的地方 - 我们有两个不同的路径来处理相同的错误条件 - 这似乎是一件坏事。所以这可以安全地减少到:
try
{
callService();
}
catch(CommunicationException)
{
handleFailure();
}
答案 2 :(得分:2)
如果您的服务托管在IIS(或WAS)中,则可以执行IIS6 / 7流程模型内置的弹性。如果工作人员进程失败,则会在其位置启动另一个进程。这个怎么运作?使用Ping进行分析。它被称为 AppoPool健康监测(描述为here)。