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 XmlHttpRequest
COM オブジェクトです。
- CLSID: {88d96a0a-f192-11d4-a65f-0040963251e5}
- プログラム ID: Msxml2.XMLHTTP.6.0
アップデート 2
ディレクティブは、max-age
すべてのキャッシュが準拠するようにクライアントによって追加されます。RFC から:
Cache-Control general-header フィールドは 、要求/応答チェーンに沿ったすべてのキャッシング メカニズムが従わなければならないディレクティブを指定するために使用されます。ディレクティブは、キャッシュがリクエストまたはレスポンスに悪影響を与えるのを防ぐための動作を指定します。これらのディレクティブは通常、デフォルトのキャッシュ アルゴリズムをオーバーライドします。キャッシュ ディレクティブは、要求にディレクティブが存在しても、同じディレクティブが応答で与えられることを意味しないという点で一方向です。
max-age はサーバー用ではありません。サーバーにとっては意味がありません。これは、ユーザーとサーバー間のすべてのキャッシュ システムを対象としています。
アップデート 3
ユーザー エージェントが HTTP キャッシュを実装する場合は、によって設定された要求ヘッダーを尊重 する必要があります(たとえば、 キャッシュをバイパスします)。エンド ユーザーがそのような動作を明示的に要求しない限り (たとえば、ページをリロードするなど)、ヘッダーを自動的に送信 または要求してはなりません。
Cache-Control
setRequestHeader()
Cache-Control: no-cache
Cache-Control
Pragma
彼らの例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 は、その要件を尊重していないようです。