C# 构造调用web服务的代码的最佳方法

C# 构造调用web服务的代码的最佳方法,c#,exception,exception-handling,C#,Exception,Exception Handling,我通过httpwebrequest调用web服务,并得到响应。web服务将全天候运行 通过检查服务是否“可用”,构造此代码的最佳方法是什么 我所拥有的: if (NetworkIsAvailable()) { // Call web service // Handle exceptions within here. } else { // to throw a relevant exception that there is no network } 抛出异常是明智的,还是只返回f

我通过httpwebrequest调用web服务,并得到响应。web服务将全天候运行

通过检查服务是否“可用”,构造此代码的最佳方法是什么

我所拥有的:

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


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

抛出异常是明智的,还是只返回false?svc永远不应该停机,这取决于您接收回的数据类型、检查频率等。我会使用一种通用解决方案,在出现故障时多次尝试连接,然后在出现故障时对“异常”进行分类(根据我的经验,没有两种异常是相同的)

例如:

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...
}
var故障计数=0;
var=false;
而((故障计数<3)和(!成功)){
试一试{
//呼叫服务。。。。
成功=真;
}捕获(WebException wex){
//处理wex,例如,查找超时并重试
}捕获(…){
//以不同的方式处理其他异常。。。
日志错误(“BOOOM:+excep”);
投掷;
}捕获(例外情况除外){
//处理一般异常
故障计数++;
}
}
如果(故障计数>=4){
//多次出现未指定错误,请做出适当反应。。。
}

显然,如果这是一个昂贵的电话,你不想进行多次尝试,这里我假设这是一种“心跳”检查,并不太昂贵。“故障计数”可以根据您期望连接的“混乱程度”进行调整。

这取决于NetworkIsAvailable()正在做什么来查看它是否可用。异常可能有助于实际记录或显示“可用”的原因。没有什么是100%正常运行的,所以检查是非常明智的。我个人在try/catch中运行它。我捕捉到网络关闭的异常,并返回JSON声明这种情况。除非您绝对确定永远不需要知道调用失败的原因(不太可能),否则抛出异常。(如果你想强迫调用方处理可能的故障,也可以返回某种类型的错误代码对象,但这在C#中并不惯用。)
false
null
是可怕的错误指示器。+1很好地处理了异常类型,并在优雅地退出之前重试了多次。谢谢@Yuck,你工作的公司不错,看起来很有趣。:)很好的双实施。我想我可以捕捉异常,让用户重试,让其他无法处理的冒泡。