吞下我无法控制数据来源的例外情况

时间:2017-10-06 13:19:55

标签: c# asp.net httpwebrequest

我正在使用一种令人沮丧的API,它有一种令人讨厌的习惯,即改变它的限制速度。有时我可以每秒发送一个请求,有时我只能每隔三到四秒发送一个请求。

考虑到这一点,我需要创建一种方法来管理它。每当请求失败时,它将返回503响应(服务不可用)。我目前的计划是使用我HttpStatusCode的{​​{1}}来确定我是否应该吞下当前的WebResponse。我可以重复这个x次,直到请求成功,或者完全取消该过程。

请注意,我无法停止并重新启动该过程,因为这对用户来说既耗时又损坏了数据结构。

目前,我已将API调用和XML加载包装到它自己的方法中:

WebException

然后我可以调用它,检查它是否返回false值,如下所示:

int webexceptionnumber = 200;
public bool webResponseSuccessful(string uri, XmlDocument doc)
{
   try
   {
      WebRequest request = HttpWebRequest.Create(uri);
      WebResponse response = request.GetResponse();
      doc.Load(response.GetResponseStream());
      return true;
   }
   catch(WebException l)
   {
      if (((HttpWebResponse)l.Response).StatusCode == HttpStatusCode.ServiceUnavailable)
      {
          webexceptionnumber = 503; // I need to do this in a much neater 
          return false;             //fashion, but this is quick and dirty for now
      }
      else
      {
          return false;
      }
   }
}

我很难过如何干净利落地做到这一点。我想通过使用if (!webResponseSuccessful(signedUri, xDoc)) { //Here is where I'm struggling - see below } 语句来避免变得更加混乱,那么当返回503响应时如何重复该操作?是goto循环的答案,还是我真的需要取消这个额外的整数并以更清洁的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

将bool更改为"返回类型"在那种类型中有一个bool,说IsSuccessful和ShouldTryAgain。然后让呼叫者决定再次运行该操作或继续。

public class ReturnType {
public IsSuccessFul{get;set;} 
public ShouldTryAgain {get;set;}
}