2

ASP.NET MVC アプリケーションでjqgridを使用しています。現在、私は mTYPE: 'POST' を次のように持っています:

jQuery("#myGrid").jqGrid({
    mtype: 'POST',
    toppager: true,
    footerrow: haveFooter,
    userDataOnFooter: haveFooter,

しかし、私はこの記事を読んでいて、次の段落を見ました。

ブラウザーは、イメージ、JavaScript、CSS ファイルをユーザーのハード ドライブにキャッシュできます。また、呼び出しが HTTP GET である場合は、XML HTTP 呼び出しもキャッシュできます。キャッシュは URL に基づいています。同じ URL であり、コンピューターにキャッシュされている場合、応答は、再度要求されたときにサーバーからではなく、キャッシュから読み込まれます。基本的に、ブラウザーは任意の HTTP GET 呼び出しをキャッシュし、URL に基づいてキャッシュされたデータを返すことができます。XML HTTP 呼び出しを HTTP GET として実行し、サーバーがブラウザーに応答をキャッシュするように通知する特別なヘッダーを返した場合、今後の呼び出しでは応答がキャッシュからすぐに返されるため、ネットワーク ラウンドトリップの遅延とダウンロード時間が短縮されます。 .

この場合、jqGrid mType をすべて切り替えて、mType に「POST」から「GET」を使用する必要がありますか? (XMLと書かれています(JSONについては言及していません)。答えが「はい」の場合、実際には、このキャッシュの利点がなくても同じことをしているように見えるので、jqGrid mTypeにPOSTを使用したい状況は何でしょうか?

4

4 に答える 4

3

あなたが説明した問題は Internet Explorer にある可能性がありますが、デフォルトのオプションを使用すると jqGrid には存在しません

使用される完全な URL を見ると、次のようなパラメーターが表示されます。

nd=1339350870256

jQuery.ajaxと同じ意味cache: trueです。jqGrid は、現在の timestemp を URL に追加して、一意にします。

個人的には jqGrid で HTTP GET を使用するのが好きですが、ndパラメーターの使用法は好きではありません。古い回答で説明した理由。URLのパラメータprmNames: {nd:null}の使用を削除するjqGridのオプションを使用することをお勧めします。ndその代わりに、サーバー側でキャッシングを制御できます。たとえば、

Cache-Control: private, max-age=0

が私の標準設定です。HTTP ヘッダーを設定するには、ASP.NET MVC アクションのコードに次の行を含めるだけです。

HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0));

詳細については、回答をご覧ください。

Cache-Control: private, max-age=0ヘッダーはデータのキャッシュを妨げないことを理解することが重要ですが、データはサーバーでの再検証なしでは決して使用されません。他の HTTP ヘッダー オプションETagを使用すると、再検証を実際に機能させることができます。ETagサーバー上のデータを変更すると、値が常に変更されるという主なアイデア。前のデータが既に Web ブラウザーのキャッシュにある場合、Web ブラウザーはキャッシュされたデータの値を使用して、HTTP 要求の一部を自動的に送信します。そのため、サーバーがデータが変更されていないことを確認した場合、HTTP 応答のステータスと空の本文を持つ HTTP 応答で応答できます。これにより、Web ブラウザーは、以前にキャッシュされたローカル データを使用できるようになります。If-None-MatchETag304 Not Modified

答えとこれには、アプローチの使用方法のコード例がありますETag

于 2012-06-10T19:00:29.430 に答える
2

すべての目的で GET を使用するべきではありません。GET リクエストは、操作の保存や削除ではなく、サーバーからデータを取得するために使用することになっています。サーバーに送信するデータやクエリ文字列として追加するデータは、GET 要求を使用して非常に大きなデータを送信できないため、GET 要求にはいくつかの制限があります。また、機密情報をサーバーに送信するために GET リクエストを使用しないでください。追加、編集、削除など、他のすべてのケースでは POST リクエストを行う必要があります。

私が知る限り、jqgrid はすべての GET リクエストに一意のキーを追加するため、ブラウザのキャッシュから何のメリットも得られません。

于 2012-06-10T16:52:40.690 に答える
2

サーバーが送信するデータが変更された場合は、POST を使用して、要求するたびにキャッシュされたデータを取得しないようにする必要があります。

于 2012-06-10T15:32:10.880 に答える
1

キャッシュ動作を回避する 1 つの方法は、リクエストが行われるたびに GET を一意にすることです。jQuery.ajax()リクエストの最後にタイムスタンプを追加することにより、「cache: false」でこれを行います。この動作を同様のもので再現できます。

uri = uri + '?_=' + (new Date()).getTime(); // uri represents the URI to the endpoint
于 2012-06-10T16:34:35.570 に答える