1

私は 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-SinceCtrl+F5 を実行したときにのみクリアされます。これは、コンテンツが変更されていない場合に 304 を正しく返すために使用できることを意味します

  • IE10

F5 と ctrl+F5 はサーバーを呼び出します。新しいタブでサイトを開いてもサーバーは呼び出されません。同じタブにアドレスを入力してもサーバーは呼び出されません。If-Modified-SinceCtrl+F5 を実行したとき、またはブラウザを再起動したときにクリアされます

キャッシュ制御: no-cache およびプラグマ: no-cach

  • クロム

If-Modified-SinceCtrl+F5 を実行したときにのみクリアされるアクションごとにサーバーを呼び出します

  • If-Modified-Sinceブラウザの再起動と Ctrl+F5 の両方でクリアされたアクションごとにサーバーを呼び出します

結論

毎回no-cacheチェックするために呼び出すことを確認したい場合は、より良いように見えます304

4

1 に答える 1

1

HTTP/1.1 仕様(RFC2616、強調) から:

13.2.2 ヒューリスティックの有効期限

オリジンサーバーは常に明示的な有効期限を提供するとは限らないため、HTTP キャッシュは通常、ヒューリスティックな有効期限を割り当て、他のヘッダー値 (Last-Modified 時間など) を使用して妥当な有効期限を推定するアルゴリズムを採用します。HTTP/1.1 仕様は特定のアルゴリズムを提供しませんが、結果に最悪の場合の制約を課します。ヒューリスティックな有効期限は意味の透明性を損なう可能性があるため、慎重に使用する必要があり、オリジン サーバーが可能な限り明示的な有効期限を提供することをお勧めします

ヘッダーを提供することLast-Modifiedは、サーバーからのリソースが必要になるたびにユーザー エージェントに更新を確認するよう求めることと同じではありません。

理想的には、Expires可能な限りヘッダーを追加する必要があります。ただし、ヘッダーを追加するCache-Control: must-revalidateと役立つはずです。

于 2013-11-04T11:09:26.827 に答える