2016-07-26 3 views
0

私のアプリケーションで最初に呼び出されるのは、今後のすべての呼び出しで使用されるセッションIDを返すWebサービスに対するLogin()リクエストです。ただし、十分な時間が経過すると、セッションIDが無効になることがあります。特定のエラーコードが返された場合、Webサービスにリクエストを再送信

UserService.Status request = serviceInstance.doSomething(id, out result) 
// If the error is for an invalid sessionID, log in again 
if (request.ErrorCode == 1) { login(); } 

正常に動作しますが、リフレッシュが実行されるまでページがまだWebサービスからの詳細のいずれかなしにロードする:だから、私の呼び出しは次のようになります。ここでの簡単な解決策は、serviceInstance.doSomething()を条件付きに貼り付けることですが、50以上のWebサービスメソッドがある場合、同じコードを50回以上複製することを意味します。これを回避し、発生するすべての状況の要求を再実行する賢い方法がありますか?私は反射と組み合わせて再試行ロジックと一緒に行くことになった

<s:complexType name="Status"> 
    <s:attribute name="Status" type="tns:ReMAEStatusType" use="required" /> 
    <s:attribute name="Source" type="s:string" /> 
    <s:attribute name="Message" type="s:string" /> 
    <s:attribute name="StackTrace" type="s:string" /> 
    <s:attribute name="ErrorCode" type="s:int" /> 
</s:complexType> 
+0

リトライロジックを実装できます。 https://msdn.microsoft.com/en-us/library/dn589788.aspx – Aravind

+0

最後の段落をチェックすると、それはまさに私が考えていたものです!私はこのデザインパターンを完全に見逃してしまったことに感心しています。唯一の問題は、すべてのリクエストに対してコードを繰り返す必要があることです。すべての可能な要求に対して再試行パターンを一般化する方法を考えれば...おそらく、C#の関数プログラミング面を使用する時が来ました。 – JTApps

+0

よろしいですか?編集に気付かなかった。外部サービスまたはリソース呼び出しを持つすべてのメソッドに対して再試行ブロックを持つことは良い考えです。私は繰り返しコードだとは思わない。実際には、紺碧のストレージのようなクラウドリソースを扱う際のベストプラクティスです。このようなものを試してみてくださいhttp://stackoverflow.com/questions/1563191/cleanest-way-to-write-retry-logic https://www.nuget.org/packages/Endjinのようなレディメイド実装のナゲットパッケージがいくつかあります.Retry、またはメソッドレベルの属性としてそれを探検することができます。それが試されているかどうかはわかりません。 – Aravind

答えて

0

:それは関連性の場合

は、Statusオブジェクトが何かのように見えます。ここでのアイデアは、すべての単一呼び出しでtry-catchループを繰り返さずに、すべてのWebServiceメソッドに対して単一のエラーを処理できることです。

// Make up to two attempts at the Try block 
for (int i = 0; i < 2; i++) 
{ 
    try 
    { 
     // Invoke some web service method that returns error codes but not exceptions here... I used reflection 
     Service.Status request = (Service.Status)typeof(WebService).GetMethod(someString).Invoke(someWebServiceInstance, someArgs); 

     if (request.ErrorCode == 0) 
     { 
      // No errors! Do some stuff. Return a value. Make sure to get out of the loop 
      return request.Message; 
     } 
     else 
     { 
      // Log some stuff if there was an error... 
      Debug.WriteLine("Error Code: " + request.ErrorCode + "\nMessage: " + request.Message); 

      // Start handling individual error codes as needed 
      if (request.ErrorCode == 1) 
      { 
       // Seems the session ID is invalid! 
       throw new UnauthorizedAccessException(request.Message); 
      } 
      else 
      { 
       // Throw some other exceptions.... 
       // If they can't be handled, make sure to break the loop in the catch block 
      } 
     } 
    } 
    catch (UnauthorizedAccessException) 
    { 
     // Start catching our exceptions. Lets get a new Session ID, and since we didn't return anything 
     // The loop will let us give the try block another shot 
     login(); 
    } 
関連する問題