私のアプリケーションで最初に呼び出されるのは、今後のすべての呼び出しで使用されるセッション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>
リトライロジックを実装できます。 https://msdn.microsoft.com/en-us/library/dn589788.aspx – Aravind
最後の段落をチェックすると、それはまさに私が考えていたものです!私はこのデザインパターンを完全に見逃してしまったことに感心しています。唯一の問題は、すべてのリクエストに対してコードを繰り返す必要があることです。すべての可能な要求に対して再試行パターンを一般化する方法を考えれば...おそらく、C#の関数プログラミング面を使用する時が来ました。 – JTApps
よろしいですか?編集に気付かなかった。外部サービスまたはリソース呼び出しを持つすべてのメソッドに対して再試行ブロックを持つことは良い考えです。私は繰り返しコードだとは思わない。実際には、紺碧のストレージのようなクラウドリソースを扱う際のベストプラクティスです。このようなものを試してみてくださいhttp://stackoverflow.com/questions/1563191/cleanest-way-to-write-retry-logic https://www.nuget.org/packages/Endjinのようなレディメイド実装のナゲットパッケージがいくつかあります.Retry、またはメソッドレベルの属性としてそれを探検することができます。それが試されているかどうかはわかりません。 – Aravind