web-dev-qa-db-ja.com

リクエストに対する応答がない場合はどうなりますか?再試行しています

私が持っている質問は、おそらくブラウザー関連の質問のほうが多いと思いますが、Webアプリケーションの構築に取り掛かるときに、答えも見つけたいかなり基本的な質問です。

クライアント側のコードでは、_$.ajax_呼び出しを行っています。この投稿への返信には時間がかかる場合があります。私が見ているのは、一定の時間が経過した後、リクエストが再度送信されていることです。

私は_$.ajax_呼び出しが再度それを送信していると思いましたが、サーバーでPOST要求が何度表示されても、beforeSendコールバックが1回だけ呼び出されているのがわかります。私のコードがそれを2回以上送信していないことをかなり確信しているので、ブラウザが再試行していると思いますか?

Wiresharkを実行して、postリクエストを複数回確認できるため、サーバーがリクエストを2回以上取得していることがわかります。だから私の仮定はこれがHTTPと関係があるのでしょうか?つまり、特定の時間内に応答が受信されない場合、要求は再送信されますか?

以下は私の通話のサンプルです。

_$.ajax({
                    async: false,
                    type: 'POST',
                    url: '<%= url_for('importDevice') %>',
                    data: { device: val },
                    retryLimit: 0,
                    //callback
                    success: function(data) {
                    alert('calling import');
                    if ( data == 'nomaster')
                    {
                            // Display a warning  toast, with a title
                            toastr.warning('You must set the Master Key first!', 'Warning');
                            $.ismasterset = false;
                            //reset the form contents after added
                    } else
                    {
                            $("div#content").html(data);
                    }
                    },
                     beforeSend: function(){
                    alert('in before send');
                    }
            });
_

これはすべての関連コードです。'retryLimit 'は使用されていません。コードから削除していないので、挿入する前に問題がありました。

クライアントとサーバーからの出力で編集されました

了解しました。「Firefox用のLive Httpヘッダー」をインストールしました。

「ジェネレーター」タブに1つの呼び出しが表示されます

_'#request# POST http://testhost/importdevice' 
_

「ヘッダー」セクションにPOSTが表示されないのは、おそらく応答がないためでしょうか。

私のWebサーバーでは、2つの呼び出しが約22秒間隔で表示されます。

_[Sun Jan 13 03:08:45 2013] [debug] POST /importdevice (Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0).

[Sun Jan 13 03:09:07 2013] [debug] POST /importdevice (Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0).
_

私はこれらの同じ呼び出しをwiresharkで見ることもできます...

これが、TCPハンドシェイクとSYN再送信と同様の方法で、応答が返されない場合にリクエストを再送信する通常の動作かどうかを尋ねていた理由です。

新規更新

私のAjax呼び出しとは何の関係もないようです。単純なHREFでボタンを作成するとします。

つまり

_<a href="/importdevice?device=serverA" class="btn btn-success">TestDirect</a>
_

次に、「ライブHTTPヘッダー出力」で取得したのは、1つのインスタンスだけです。

_#request# GET http://172.16.118.15/importdevice?device=serverA
_

しかし、もう一度私のサーバーログに表示されます。

_[Sun Jan 13 03:20:25 2013] [debug] GET /importdevice (Mozilla/5.0 (Macintosh; Intel Mac OS  X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0).
[Sun Jan 13 03:20:48 2013] [debug] GET /importdevice (Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0).
_

そして、サーバーのwiresharkで私はそれを2回も見ています...そして予想通り私のサーバーコードも2回呼び出されています...これは本当に私を混乱させます。

22
user1768233

何が起こっているかを説明するこのブログ投稿をチェックアウトしてください: http://geek.starbean.net/?p=39

HTTP/1.1 RFC 8.2.4 によると:

HTTP/1.1クライアントが、リクエスト本文を含むが、「100-continue」期待値を持つExpectリクエストヘッダーフィールドを含まないリクエストを送信する場合、およびクライアントがHTTP/1.1オリジンサーバーに直接接続されていない場合、そしてサーバーからステータスを受信する前にクライアントが接続のクローズを確認した場合、クライアントはリクエストを再試行する必要があります(SHOULD)。

これらの追加のリクエストを許容するようにWebアプリを設計してください。また、データベースに何かを書き込むなど、ajaxリクエストで1回だけ何かを実行する場合は、リクエストをべき等として設計する必要があります。参照: べき等演算とは

また、これはGETとPOST操作: http://www.cs.tut.fi/~jkorpela/forms/methods.html の違いを強調しています。

一般的な設計手法として:
-GET操作はべき等として設計する必要があります
-POST操作は、データベースへの書き込みなどに使用する必要があります。

27
BigMacAttack

リクエストがnot asyncの場合、なぜコールバックを設定するのですか?

同期プロセスが必要な場合は、コールの後にbeforeSendコードbeforeを入力し、直後にsuccessコールバックを配置します呼び出し。

非同期のアプローチが必要な場合は、設定async:true

また、このコード行は間違っています:

url: '<%= url_for('importDevice') %>',

引用符を見てください:

url: '<%= url_for("importDevice") %>',

多分それらの提案は問題を解決しないかもしれませんが、正しい方向にあなたを向けるでしょう。問題は投稿されたコード以外の場所にある可能性があります...

あなたの質問に戻ります:それはブラウザでしょうか?私は考えていませんが、誰がそこにあるのか知っています!! ...ブラウザは何ですか?別のもので試しましたか?

私は、Firefoxで試してLive httpHeadersプラグインを使用することをお勧めします(セットアップと使用が非常に簡単です)。何が起こっているかがわかりますクライアント側から、サーバー側から何が起こっているかを確認するのではなく。

0
Paolo