2014-03-06 67 views
1

我有一些消耗Web服务的代码。我不想每次都从服务中检索会话密钥,我想尝试使用我设置的会话变量的响应,并且如果出现403错误,请获取新的会话密钥并重试。嵌套Try/Catch语句替代

在我有限的心智嵌套try/catch声明是有道理的,但我只是很好,意识到必须有一个更好的方法。我在这里读了几篇文章,提到诸如lambda expressions with using statementsHelpers之类的东西,但这些也可能是来自外行星科学对我的礼物。

总是乐于学习我想知道如果有人有建议(有详细信息或指向细节的链接)?这里的一切工作,我只需要一个比嵌套try声明更好的方法(请和谢谢)。一如既往,你们摇滚!

public string getMySessionkey去与登录凭证的服务器,以获得一个会话密钥(要求所有其他查询),如果没有一个会话密钥已经设置

searchPacket = stringbuilder with parameters and session key

if (Session["MySessionKey"] != null) 
{ 
    sessionKee = Session["MySessionKey"].ToString(); 
} 
else 
{ 
    sessionKee = getMySessionkey(_cbE, _cbP); 
    System.Web.HttpContext.Current.Session.Add("MySessionKey", sessionKee); 
} 

try 
{ 
    mySearchResults = getResults(searchPacket.ToString()); 
    vbResultz += Server.HtmlEncode(mySearchResults) ; 
} 
catch (WebException wx) 
{ 
    HttpWebResponse webresponse ; 
    webresponse = (HttpWebResponse)wx.Response; 

    switch (webresponse.StatusCode) 
    { 
     case HttpStatusCode.InternalServerError: 
      ... 
      break; 

     case HttpStatusCode.Forbidden: // 403 
      vbResultz = "You aint got no valid session key!"; 
      // code here to get a new session key and try again 

      break; 

     default: 
      throw; 
    } 
} 

回答

2

使用带圈一个有限的发生次数。一旦你的电话工作,退出循环。

var maxNumberOfTries = 3; 
var currentTry = 0; 
var success = false; 

do 
{ 
    currentTry += 1; 

    // Try whatever here. If it works, set success variable to true 

    if (success) break; 
} while (currentTry <= maxNumberOfTries) 

if (!success) 
{ 
    // If code reaches here, whatever had to be done has been tried <maxNumberOfTries> times and did not work 
} 

编辑:这是在你的代码中实现上面的示例:

var maxNumberOfTries = 3; 
var currentTry = 0; 
var flag = false; 

do 
{ 
    currentTry += 1; 

    try 
    { 
     mySearchResults = getResults(searchPacket.ToString()); 
     vbResultz += Server.HtmlEncode(mySearchResults) ; 
     flag = true; 
    } 
    catch (WebException wx) 
    { 
     HttpWebResponse webresponse ; 
     webresponse = (HttpWebResponse)wx.Response; 

     switch (webresponse.StatusCode) 
     { 
      case HttpStatusCode.InternalServerError: 
      ... 
       flag = true; 
       break; 

      case HttpStatusCode.Forbidden: // 403 
       vbResultz = "You aint got no valid session key!"; 
       // code here to get a new session key and try again 

       break; 

      default: 
       throw; 
     } 
    } 
    if (flag) break; 
} while (currentTry <= maxNumberOfTries) 

if (!flag) 
{ 
    // If code reaches here, whatever had to be done has been tried <maxNumberOfTries> times and did not work 
} 

这里flag变量将被设置为true成功尝试获取密钥,或发生内部服务器错误。如果您有403个响应,它将再次尝试,最多三次。

+0

工作就像一个魅力,thanx如此之多。尽管如此,仍然想了解lamba和助手。 – Darkloki

+0

@ user116923我不太确定这将如何使您在这个特定问题上受益。 – Crono