C# 构造调用web服务的代码的最佳方法
我通过httpwebrequest调用web服务,并得到响应。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
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,你工作的公司不错,看起来很有趣。:)很好的双实施。我想我可以捕捉异常,让用户重试,让其他无法处理的冒泡。