5

Asp.Netアプリケーションには、画像の要求を処理するIHttpHandlerがあります。ハンドラーは、画像キャッシュ内の画像を識別する特別なIDで呼び出されます。画像が現金に入れられると、それは決して変わりません。私の質問は:

指定された日付を実際にチェックせずに、「If-Modified-Since」ヘッダーを持つリクエストに対して常にhttpステータスコード304を返すことは問題ありませんか?その理由は、ブラウザにはすでに画像のコピーが必要であるということです(それは、modified-sinceヘッダーを提供していたためです)。

これにより、(まだ)イメージの作成日を追跡しないため、作業が楽になります。

実際のコードは次のとおりです(更新:Aristosが推奨するように、サーバーの応答にif-modifiedヘッダーを含めました):

public void ProcessRequest(HttpContext context)
{
    if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])) {
        //Is this okay?
        context.Response.StatusCode = 304;
        context.Response.StatusDescription = "Not Modified";
        return;
    }
    var thumbnailId = context.Request.QueryString["thumbnail"];
    using (var thumbnailCache = new CThumbnailCache()) {
        var imageBytes = thumbnailCache.GetImageById(thumbnailId);

        context.Response.ContentType = "image/png";
        var outputStream = context.Response.OutputStream;
        outputStream.Write(imageBytes, 0, imageBytes.Count());
        context.Response.Cache.SetCacheability(HttpCacheability.Public);
        context.Response.Cache.SetLastModified(DateTime.UtcNow);
        // added after Aristos post
        context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("r"));

        const int maxAge = 86400 * 14; // 14 Tage
        context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(maxAge));
        context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, maxAge));
        context.Response.CacheControl = "private";
        context.Response.Cache.SetValidUntilExpires(true);

    }
}
4

2 に答える 2

3

大丈夫です。リソースがブラウザ上にあることを取得した瞬間から、そのIf-Modified-Sinceままにしておくかどうかを決定します。

ここで、お二人の考えを述べたいと思います。このヘッダーを設定したようには見えないため、おそらくブラウザーで取得できません。

これを実際に機能させるには、この行を追加する必要があります

context.Response.AddHeader("If-Modified-Since", LastModifledOfImage.ToString()); 

または、現在の日時を送信する場合:

context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString());

画像を送るとき。を使用してSetLastModifiedいるようですが、これはLast-Modifiedチェックしたヘッダーではなくヘッダーに設定されています。

可能であれば、この画像を実際に静的にすることを検討してください。これでもIf-Modified-Sinceサーバーへの呼び出しが 1 回行われますが、実際に静的なリソースは、サーバーに問い合わせることなくブラウザーのキャッシュから直接画像を取得します。

于 2012-07-02T11:42:07.857 に答える
2

仕様による:

クライアントが条件付き GET リクエストを実行し、アクセスが許可されているが、ドキュメントが変更されていない場合、サーバーはこのステータス コードで応答する必要があります。

そうですね、条件は満たしているようです。応答に必ず Date ヘッダーを含めてください。

于 2012-07-02T11:43:09.240 に答える