私は Owin との金属 HTTP もつれに近いものをやっています。JavaScriptを出力するowinミドルウェアがあります。こんな感じです(該当部分)
public override Task Invoke(IOwinContext context)
{
var response = context.Response;
response.ContentType = "application/javascript";
response.StatusCode = 200;
if (ClientCached(context.Request, scriptBuildDate))
{
response.StatusCode = 304;
response.Headers["Content-Length"] = "0";
response.Body.Close();
response.Body = Stream.Null;
return Task.FromResult<Object>(null);
}
response.Headers["Last-Modified"] = scriptBuildDate.ToUniversalTime().ToString("r");
return response.WriteAsync(js);
}
private bool ClientCached(IOwinRequest request, DateTime contentModified)
{
string header = request.Headers["If-Modified-Since"];
if (header != null)
{
DateTime isModifiedSince;
if (DateTime.TryParse(header, out isModifiedSince))
{
return isModifiedSince >= contentModified;
}
}
return false;
}
クライアントがキャッシュされていない場合は 200 を出力し、Last-Modified 日付をヘッダーに追加します。クライアントがキャッシュされている場合は、304 "Not modified" を出力します。
問題は、ブラウザでハード F5 を実行しない限り、クライアントが URL を再度呼び出さないことです。最終変更キャッシュについての私の理解は、コンテンツが変更されたかどうかを確認するために毎回呼び出す必要があるということですか?
アップデート:
コントロール: 再検証が必要
- クロム
F5 と ctrl+F5 はサーバーを呼び出します。新しいタブでサイトを開くか、ブラウザを再起動するとサーバーが呼び出されます。同じタブにアドレスを入力してもサーバーは呼び出されません。If-Modified-Since
Ctrl+F5 を実行したときにのみクリアされます。これは、コンテンツが変更されていない場合に 304 を正しく返すために使用できることを意味します
- IE10
F5 と ctrl+F5 はサーバーを呼び出します。新しいタブでサイトを開いてもサーバーは呼び出されません。同じタブにアドレスを入力してもサーバーは呼び出されません。If-Modified-Since
Ctrl+F5 を実行したとき、またはブラウザを再起動したときにクリアされます
キャッシュ制御: no-cache およびプラグマ: no-cach
- クロム
If-Modified-Since
Ctrl+F5 を実行したときにのみクリアされるアクションごとにサーバーを呼び出します
If-Modified-Since
ブラウザの再起動と Ctrl+F5 の両方でクリアされたアクションごとにサーバーを呼び出します
結論
毎回no-cache
チェックするために呼び出すことを確認したい場合は、より良いように見えます304