2012-01-30 40 views
4

我正在通过httpwebrequest调用Web服务并获取响应。 Web服务旨在全天候运行。构建调用Web服务的代码的最佳方式

构建此代码的最佳方法是什么?检查服务是否“可用”?

我有什么:

if (NetworkIsAvailable()) 
{ 
    // Call web service 
// Handle exceptions within here. 
} 


else 
{ 
// to throw a relevant exception that there is no network 
} 

是否明智抛出一个异常,或者只是返回false?该svc不应该下降

+0

这取决于NetworkIsAvailable()正在做什么以查看它是否可用。实际记录或显示某些“可用”的原因的例外可能是有用的。没有什么是100%的正常运行时间,所以检查是非常明智的。 – 2012-01-30 17:33:48

+3

我亲自在try/catch中运行它。我发现网络关闭的异常,并返回JSON声明。 – 2012-01-30 17:35:35

+1

除非您确定无需知道呼叫失败的原因(不太可能),否则会抛出异常。 (或者,如果你想强制调用者处理可能的失败,那么返回某种错误代码对象,但在C#中这不是真正的惯用方法。)'false'和'null'是可怕的错误指示符。 – millimoose 2012-01-30 17:56:32

回答

4

根据您收到的数据的类型,检查的频率等我会使用一个通用的解决方案,尝试多次连接失败,然后分类“例外”上失败(根据我的经验,没有两个例外是相同的)。

例如:

var failCount = 0; 
var succeeded = false; 

while ((failCount < 3) && (!succceeded)) { 
    try { 
     //call service.... 
     succeeded = true; 
    } catch(WebException wex) { 
     //handle wex, for instance look for timeout and retry 
    } catch(...) { 
    //Handle other exceptions differently... 
    LogError("BOOOM: " + excep); 
    throw; 
    } catch(Exception ex) { 
    //handle a general exception 
    failCount++; 
    } 
} 

if (failCount >= 4) { 
    //Unspecified error multiple times, react appropriately... 
} 

显然你不希望如果昂贵的调用,在这里我想它的一种“心跳”检查那不是太贵为此多次尝试。 “failCount”可以根据您希望连接的“动荡”进行调整。

+2

+1不错的工作方式,以不同的方式处理异常类型,并在优雅地退出之前重试多次。 – Yuck 2012-01-30 18:17:27

+0

谢谢@Yuck,你工作的好公司,看起来很有趣。 :) – GrayWizardx 2012-01-30 18:19:36

+0

好bimplementation。我想我可以捕捉异常并让用户重试,并让其他无法处理的人冒泡。 – dotnetdev 2012-01-30 21:36:03

相关问题