34

MSXML のXmlHttpRequestオブジェクトを使用してリクエストを発行しています。

IXMLHttpRequest http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.send();

そしてsend成功し、xml データを取得します。

XmlHttpRequestそれが実際にネットワークにヒットしなかったことを除いて(実際のhttpリクエストが発行されていないことがわかります)。また、Process Monitor は、ファイルが実際にキャッシュから提供されていることを示しています。

ここに画像の説明を入力

XmlHttpRequestしたがって、キャッシュされたコンテンツが 0 秒よりも古いものは古すぎることをユーザー エージェントに指示したいと思います。これを行う標準的な方法は、リクエスト ヘッダーを追加することです。

Cache-Control: max-age=0

送信リクエストに:

http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();

そしてsend成功し、xml データを取得します。

XmlHttpRequestそれが実際にネットワークにヒットしなかったことを除いて(実際のhttpリクエストが発行されていないことがわかります)。また、Process Monitor は、ファイルが実際にキャッシュから提供されていることを示しています。

では、何が問題なのですか?max-age私が思っていることをしていませんか?

RFC 2616 - ハイパーテキスト転送プロトコル、パート 14: ヘッダー フィールドの定義から:

他のディレクティブを使用すると、ユーザー エージェントは基本的な有効期限メカニズムを変更できます。これらのディレクティブは、リクエストで指定できます:

max-age
クライアントが、経過時間が指定された時間 (秒) を超えない応答を受け入れる意思があることを示します。max-stale ディレクティブも含まれていない限り、クライアントは古い応答を受け入れません。

まさに私が欲しいもの。

Cache-Control: max-age=0まさに私が望むものではありませんか、それとも MSXML のオブジェクトにXmlHttpRequestバグがありますか?

アップデートワン

これは MSXML XmlHttpRequestCOM オブジェクトです。

  • CLSID: {88d96a0a-f192-11d4-a65f-0040963251e5}
  • プログラム ID: Msxml2.XMLHTTP.6.0

アップデート 2

ディレクティブは、max-ageすべてのキャッシュが準拠するようにクライアントによって追加されます。RFC から:

Cache-Control general-header フィールドは 、要求/応答チェーンに沿ったすべてのキャッシング メカニズムが従わなければならないディレクティブを指定するために使用されます。ディレクティブは、キャッシュがリクエストまたはレスポンスに悪影響を与えるのを防ぐための動作を指定します。これらのディレクティブは通常、デフォルトのキャッシュ アルゴリズムをオーバーライドします。キャッシュ ディレクティブは、要求にディレクティブが存在しても、同じディレクティブが応答で与えられることを意味しないという点で一方向です。

max-age はサーバー用ではありません。サーバーにとっては意味がありません。これは、ユーザーとサーバーのすべてのキャッシュ システムを対象としています。

アップデート 3

W3C XmlHttpRequestから:

ユーザー エージェントが HTTP キャッシュを実装する場合は、によって設定された要求ヘッダーを尊重 する必要があります(たとえば、 キャッシュをバイパスします)。エンド ユーザーがそのような動作を明示的に要求しない限り (たとえば、ページをリロードするなど)、ヘッダーを自動的に送信 または要求してはなりません。Cache-ControlsetRequestHeader()Cache-Control: no-cacheCache-ControlPragma

彼らのno-cacheに従って、ディレクティブを使用してみました:

http = new XmlHttpRequest();
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "no-cache");
http.send();

また、XmlHttpRequestクライアントは、サーバーにまったくクエリを実行せずに、キャッシュから完全にリクエストを処理します。

W3C は、キャッシュが存在する場合、Cache-Controlそれが設定されているかどうかを尊重する必要があると述べていsetRequestHeaderます。Microsoft の XmlHttpRequest は、その要件を尊重していないようです。

4

10 に答える 10

25

残念ながら、XMLHttpRequestこのオブジェクトは WinInet に基づいているため、このように設計されています。また、サーバー側からの使用はお勧めしません。同じ機能を持つを使用する必要がありますが、代わりにServerXMLHttpRequest依存していWinHTTPます。詳細については、FAQを参照してください。ServerXMLHttpドキュメントの説明には、次のように記載されています。

HTTP クライアント スタックは、より長いアップタイムを提供します。URL キャッシュ、プロキシ サーバーの自動検出、HTTP/1.1 チャンク、オフライン サポート、Gopher および FTP プロトコルのサポートなど、サーバー アプリケーションにとって重要ではない WinInet 機能は、新しい HTTP サブセットには含まれていません。

これは、 XmlHttpRequestを使用するのではなく、次のことを意味します。

IXMLHTTPRequest http = CreateComObject("Msxml2.XMLHTTP.6.0");     http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();

ServerXmlHttpRequestを使用できます。

IXMLHTTPRequest http = CreateComObject("Msxml2.ServerXMLHTTP");
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();

またはWinHttpRequest :

IWinHttpRequest http = CreateComObject("WinHttp.WinHttpRequest.5.1");
http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml", False, "", "");
http.setRequestHeader("Cache-Control", "max-age=0");
http.send();
于 2011-03-22T04:49:47.513 に答える
8

ヘッダーを使用して、最後のリクエストのIf-None-Match値と一致しない値を指定すると機能することがわかりました。ETag

例えば:

req.open("GET", url, false);
req.setRequestHeader("If-None-Match", "\"doesnt-match-anything\"");
req.send();

これには、応答に。が含まれている必要がある場合とない場合がありますETagETag(各応答に値が含まれているサービスでのみ試しました。)

于 2012-01-06T15:25:21.127 に答える
1

標準のWindowsクライアントでの私の手っ取り早い回避策は次のとおりでした-
インターネットオプション
-一般
-閲覧履歴設定
-保存されたページの新しいバージョンを確認します:「(x)Webページにアクセスするたびに」 今私の
Mxml2.XMLHTTP.x.0オブジェクトはもうキャッシュを使用しません ...

于 2014-05-07T16:08:19.743 に答える
1

これをキープアライブセッションに使用していますが、うまく機能します。
秘訣は、ヘッダー「If-Modified-Since」を、ブラウザーによってキャッシュされた値よりも新しい値で使用することです。

g_AjaxObj.onreadystatechange = function() { if(g_AjaxObj.readyState === 4) { AjaxOnComplete_("KeepAlive"); }};
g_AjaxObj.open('GET', URL, true);
g_AjaxObj.setRequestHeader("If-Modified-Since", new Date().toUTCString());
g_AjaxObj.send(null);
于 2011-11-07T16:00:40.910 に答える
1

URI の最後に、リクエストごとに変化する偽のパラメーターを追加できますか?

http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml?requestID=42", False, "", "");
于 2011-03-08T16:43:54.093 に答える
0

このヘッダーはサーバー用であり、ブラウザーはイベントで要求を行わないため、役に立ちません。

簡単なトリックは、次のようにページをロードすることです:

http.open("GET", "http://www.bankofcanada.ca/stat/fx-xml.xml?"+Math.random(), False, "", "");
于 2011-03-08T16:46:01.307 に答える
0

「cache-control: private」をヘッダーとして送信してみてください。これは私のために働いた:

var request = new XMLHttpRequest();
request.open("GET", 'http://myurl.com' , false); 

request.setRequestHeader("cache-control", "private");

no-cache と max-age の両方が無視される Windows 8 用の HTML & Javascript アプリを作成しています。私にとって、上記はうまく機能します。

私はヘッダーに慣れていなかったので、キャッシュ制御を少し掘り下げました: プライベート...

Indicates that all or part of the response message is intended for a single user and MUST NOT be cached by a shared cache, such as a proxy server.

キャッシュ制御とは: プライベート?から およびhttp://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

したがって、基本的に、これはキャッシュ エントリを作成しないため、'cache-buster' 乱数パラメータのように、不必要であることがわかっているキャッシュ エントリは追加されません。

于 2014-06-16T11:52:46.240 に答える
0

これは私を夢中にさせていました。この SO スレッドは、答えを提供することに最も近づきました。残念ながら、テスト中に実際に機能したものはありませんでした。正しく動作することがテストされた唯一の解決策は、次のように設定することでした。

ヘッダー プラグマ: no-cache

IEの頭痛で他の人を救うことを願っています.

ところで、これは StackOverflow スレッドであり、Pragma と Cache-control の違いを明らかにするのに最適です 。Pragma と Cache-control ヘッダーの違いは?

于 2016-03-04T16:09:38.557 に答える
0

その欠点は、同じコンテンツの複数のコピーでキャッシュをあふれさせることです。これは、バグのある http エージェントに関するハックかもしれませんが、実際の解決策は、キャッシング メカニズムに対抗するのではなく、キャッシング メカニズムを使用することです。–</p>

これが理想的ではなく、実際の解決策ではないことに同意しますが、Mozilla は実際にこれを回避策として推奨しているので、それほどひどいものではないと思います - https://developer.mozilla.org/en-US/docs/DOM /XMLHttpRequest/Using_XMLHttpRequest

その上、私はこれを解決しようとして髪を引き裂いていました。私は、ユーザーがブラウザをクリアすることに頼らなければなりませんでした (彼らはそれを忘れ続けています)。だからこれは私にとって天の恵みです!

于 2013-03-11T01:44:17.827 に答える
0

古い msxml ライブラリの場合、URI アドレスにランダムに生成された値を使用します。

http://youlink?mysession=random_number

ヴォイテク

于 2011-09-19T15:34:57.863 に答える