2010-05-19 56 views
4

我将有一个客户端应用程序使用WCF服务的代理。这个客户端将是一个Windows窗体应用程序,在一个地址处对N个端点进行basicHttpBinding。是否有检查WCF服务是否在线的示例?

我要解决的问题是,当任何Windows窗体应用程序会通过互联网来获取必须有我的Web服务器在线将需要了解这个特殊的WCF服务是在线我的Web服务器。我需要一个例子,说明后台线程上的这个客户端如何能够对“WCF服务......,你在那里?”进行轮询。这样,我们的客户端应用程序就可以在客户端投入大量时间来建立客户端工作之前通知客户端,只会让WCF服务处于脱机状态而感到沮丧。

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

回答

11

这是什么痴迷检查这些服务是否存在?

只需拨打服务和任何防御性编程课程会教你,准备好处理异常。

真的没有好处在不断发送“你在吗?”请求所有的线...

即使你可能有类似于Ping()方法(它只是返回一个固定的值或什么 - 你的服务名称或其他) - 只检查你的服务是否可达 - 那怎么办您需要查询以获取数据的数据库?你的服务方法依赖于其他服务呢?它变得非常混乱,非常非常棘手,想办法检查所有这些 - 只是为了看看它是否在那里。

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

+2

是的,服务层之外可能存在问题..,同意。我不认为你应该明白这一点,即向客户提供一个早期信号,告诉他们不在线,这样他们就不会离线工作,最终只会感到沮丧。就持久性而言,如果我们至少可以达到服务层,那么我们就拥有处理该异常的方法。我需要一个解决方案来解决这个问题,并且我目前还没有解决一系列额外的潜在问题。 – apolfj 2010-05-19 16:40:45

+0

也只是创建一个ping方法可以工作。我想知道WCF管道是否有内置的这个动作呢? – apolfj 2010-05-19 16:41:58

+0

@apolfj:不,WCF运行时没有任何东西来检查服务可用性,据我所知。我们有一种像Ping()方法 - 称为Version() - 它返回服务版本(来自程序集) - 但我们的客户端真的从来不会调用该方法... – 2010-05-19 16:43:36

5

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

if(serviceIsAlive()) 
{ 
    callService(); 
} 
else 
{ 
    handleFailure() 
} 

您是否看到此代码段的问题?如果在检查服务是否存在以及您打电话给服务器的时间之间发生了什么,服务会停止?这是一个竞赛条件,还有一个等待发生的错误。所以,你需要做的,即使你可以检查服务的条件是什么,就是:

if(serviceIsAlive()) 
{ 
    try 
    { 
     callService(); 
    } 
    catch(CommunicationException) 
    { 
     handleFailure(); 
    } 
} 
else 
{ 
    handleFailure(); 
} 

但在这个块中,handleFailure()调用是在两个不同的地方 - 我们有两个不同的路径来处理相同的错误条件 - 这看起来是一件坏事。因此,这可以安全地简化为:

try 
{ 
    callService(); 
} 
catch(CommunicationException) 
{ 
    handleFailure(); 
} 
+1

同意totaly。我们得出同样的结论:验证服务是否已启动的最佳方法是调用它并处理将发生的异常。而且,我们可以设置一个“可靠性”的方法,在我的文章中描述。 – Erup 2010-05-19 17:34:30

+0

嗯,请记住,你永远无法真正知道服务是否'起来'。你可以知道的是,如果你最近收到它的消息。所以,在这种情况下你真的可以发送定期的心跳消息。 – kyoryu 2010-05-22 06:09:39

+0

如果我们可以删除尝试catch'es,因为异常是资源消耗,所以如果我们可以把一个简单的如果没有try catch,系统处于一个更好的状态,比直接尝试catch,这个服务是并且应用程序正在运行多线程进程,如果出现异常,将会出现过多的性能过热... – deadManN 2017-10-11 06:11:11

2

如果你的服务是托管在IIS(或WAS),您可以执行内置到IIS6/7过程模型弹性。如果工人过程失败,另一个将在其位置开始。怎么运行的?使用Ping分析。其名为AppoPool健康监测(描述here)。