是否有一个检查WCF服务是否在线的示例?

apo*_*lfj 5 c# wcf

我将使用代理到WCF服务的客户端应用程序.此客户端将是一个Windows表单应用程序,对地址中的N个端点执行basicHttpBinding.

我想要解决的问题是,当任何窗体形成应用程序通过互联网获取我的网络服务器必须让我的网络服务器在线将需要知道这个特定的WCF服务是在线的.我需要一个示例,说明后台线程上的这个客户端如何能够仅轮询"WCF服务..,你在吗?" 通过这种方式,我们的客户端应用程序可以在他们投入大量时间建立客户端工作之前通知客户端,只有在WCF服务脱机时才会感到沮丧.

我再次寻找一种简单的方法来检查WCF服务"你在吗?"

mar*_*c_s 11

这种对于检查这些服务是否存在的困扰是什么?

只需打电话给服务,任何防御性编程课程都会教你,准备好处理异常.

不断发送"你在吗?"真的没有任何好处.请求全线...

即使您可以使用某种Ping()方法(只返回固定值或其他内容 - 您的服务名称或其他内容) - 只检查您的服务是否可访问 - 您需要查询数据库以获取数据?您的服务方法依赖于其他服务怎么样?找到一种方法来检查所有这些 - 只是为了看它是否在那里,它变得非常混乱和非常棘手.

简而言之:不,没有可靠而有意义的方法来检查给定服务是否"存在"和"活着" - 只需调用它!并准备好处理失败 - 它有时失败......

  • 是的,服务层之外可能存在问题..,同意.我认为你并不认为重要的是要让我们的客户早日发出信号表明它不存在,这样他们就不会离线工作而最终只会感到沮丧.就持久性而言,如果我们至少可以到达服务层,我们就有处理该异常的方法.我需要一个解决方案来解决这个问题,我不会解决当前一系列其他潜在问题. (2认同)
  • 我有一个用例在我的UI上显示网络状态的指示.甚至还有很好的理由.没有心跳你能实现吗?不.什么都不感谢.为什么要勾选这个? (2认同)

kyo*_*ryu 5

检查服务是否存在没有价值.绝对没有.为什么?

if(serviceIsAlive())
{
    callService();
}
else
{
    handleFailure()
}
Run Code Online (Sandbox Code Playgroud)

你看到这个片段的问题了吗?如果在您检查服务是否处于活动状态与调用服务的时间之间,服务会中断,会发生什么?这是竞争条件,等待发生的错误.因此,即使您可以检查服务条件,您需要做的是:

if(serviceIsAlive())
{
    try
    {
        callService();
    }
    catch(CommunicationException)
    {
        handleFailure();
    }
}
else
{
    handleFailure();
}
Run Code Online (Sandbox Code Playgroud)

但是在这个块中,handleFailure()调用在两个不同的地方 - 我们有两个不同的路径来处理相同的错误条件 - 这似乎是一件坏事.所以这可以安全地减少到:

try
{
    callService();
}
catch(CommunicationException)
{
    handleFailure();
}
Run Code Online (Sandbox Code Playgroud)