リクエストのキューイングを処理するフレームワークのクラスが存在するかどうか疑問に思っています。
リクエストが送信されたら、キューに追加する必要があります。何か問題がある場合 (インターネットがない場合) は、リクエストを保存し、後で再送信を試みる必要があります。
その間、さらに多くのリクエストを作成できます。それでもネットワークがない場合は、すべての新しいリクエストをキューに保存し、ネットワークが戻ってくる間に再度送信する必要があります。
すでに実装されているかどうか疑問に思って、同じ機能を作ろうとしています。
EDIT1:サーバーとの間でjsonデータを投稿/取得するためにHttpWebRequestを使用しています。
EDIT2:サンプルケース:
ユーザーが Button1 を押します。最初のリクエストが送信され、キューに追加され(インターネットが利用可能)、アプリが応答を取得し、リクエストがキューから削除されます。
ユーザーがボタン 2 を押します。2 番目のリクエストが送信され、キューに追加されます。インターネット接続はありません -> リクエストはキューに保存されます。
ユーザーがボタン 3 を押します。3 番目の要求が送信されますが、キューが空ではないため、キューに格納されるだけです。Request2 は配信を試みますが、まだ接続されていません。
しばらくして、接続が再度確立されるため、Request2 が成功してキューから削除され、次に Request3 も成功してキューから削除されます。
重要なのは、トゥームストーンに耐性があることです。要求を呼び出す前に電話がスリープ状態になった場合は、それを保存する必要があります。リクエストが進行中である場合は、キャンセルする必要があります (または、このメッセージを保存しないでください)。
EDIT3:配信の例外を回避するために、このラッパーを使用しています:
public async Task<string> GetAsync(string url)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = HttpMethod.Get;
httpWebRequest.Accept = "application/json";
try
{
var response = (HttpWebResponse)await httpWebRequest.GetResponseAsync();
if (response == null || response.StatusCode != HttpStatusCode.OK)
return String.Empty;
string data;
using (var responseStream = response.GetResponseStream())
{
using (var postStreamReader = new StreamReader(responseStream))
{
data = await postStreamReader.ReadToEndAsync();
postStreamReader.Close();
}
responseStream.Close();
}
return data ?? String.Empty;
}
catch (Exception ex)
{
return String.Empty;
}
}
例外がある場合は String.Empty を返し、それ以外の場合はサーバーの回答の文字列を返します。私が今必要としているのは、呼び出しが成功した (結果が空でない) ことを保証するパターンです。
EDIT4:今のところ、セマフォにキューを用意することを検討しており、プッシュを強制する必要があるときにそれを呼び出します。それがうまくいくかどうか、何か考えはありますか?