3

リクエストのキューイングを処理するフレームワークのクラスが存在するかどうか疑問に思っています。

リクエストが送信されたら、キューに追加する必要があります。何か問題がある場合 (インターネットがない場合) は、リクエストを保存し、後で再送信を試みる必要があります。

その間、さらに多くのリクエストを作成できます。それでもネットワークがない場合は、すべての新しいリクエストをキューに保存し、ネットワークが戻ってくる間に再度送信する必要があります。

すでに実装されているかどうか疑問に思って、同じ機能を作ろうとしています。

EDIT1:サーバーとの間でjsonデータを投稿/取得するためにHttpWebRequestを使用しています。

EDIT2:サンプルケース:

  1. ユーザーが Button1 を押します。最初のリクエストが送信され、キューに追加され(インターネットが利用可能)、アプリが応答を取得し、リクエストがキューから削除されます。

  2. ユーザーがボタン 2 を押します。2 番目のリクエストが送信され、キューに追加されます。インターネット接続はありません -> リクエストはキューに保存されます。

  3. ユーザーがボタン 3 を押します。3 番目の要求が送信されますが、キューが空ではないため、キューに格納されるだけです。Request2 は配信を試みますが、まだ接続されていません。

  4. しばらくして、接続が再度確立されるため、Request2 が成功してキューから削除され、次に Request3 も成功してキューから削除されます。

  5. 重要なのは、トゥームストーンに耐性があることです。要求を呼び出す前に電話がスリープ状態になった場合は、それを保存する必要があります。リクエストが進行中である場合は、キャンセルする必要があります (または、このメッセージを保存しないでください)。

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:今のところ、セマフォにキューを用意することを検討しており、プッシュを強制する必要があるときにそれを呼び出します。それがうまくいくかどうか、何か考えはありますか?

4

4 に答える 4

3

Queue オブジェクトを使用して要求された URL のリストを保持する簡単な例を作成しました。基本的には、リクエストを 1 つずつ行うだけです。そして、リクエストが完了すると、常に Completed イベントを送信します。その後、返されたページまたは返されたエラー条件を処理するのは、Completed イベントのハンドラー次第です。

また、トゥームストーンのサポートもあります。基本的に、Application_Deactivated または Application_Closing コールバックが呼び出されると、キューが分離ストレージに保存されます。アプリが廃棄段階から戻った場合、アプリ コンストラクター/Application_Activated 関数でそれを読み込みます。これで始められることを願っています。

http://www.mediafire.com/download/cncuwx1kttehv8y/PhoneApp15.zip

于 2013-10-23T14:49:55.313 に答える
2

申し訳ありませんが、完全な回答をする時間がありませんが、System.Threading.Tasks.Dataflow 名前空間には非常に役立つものがあるかもしれません。

于 2013-11-12T00:17:44.780 に答える
0

これは記憶から浮かんだだけです。しかし、永続性が実装されているかどうか、およびどのように実装されているかについてはわかりません。ブラウザの再起動後もメッセージを配信する必要がある場合は、ローカル ストレージを使用してその部分を実装できます。

プロトコルとしてのStompは、ニーズに応えることができます。ここにいいですね: http://blog.mayflower.de/2011-Message-Queues-for-web-applications-with-STOMP.html

その他のオプション: jQuery 用メッセージバス

完全なサービスバスはおそらく少しやり過ぎですが、いくつかのアイデアを借りると、有利なスタートを切ることができます。

pServicebus C# でサーバーサイドを実装し、JS クライアントが付属

MassTransit の JSクライアント: MassTransit-JS

于 2013-10-21T14:35:07.190 に答える