如果内容是静态的,那么对于具有"If-Modified-Since"的请求,总是返回http状态304是否可以

ste*_*n.s 5 asp.net caching http-headers

在我们的Asp.Net应用程序中,我们有一个IHttpHandler处理图像请求.使用特殊id调用Handler,该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);

    }
}
Run Code Online (Sandbox Code Playgroud)

Ari*_*tos 3

没关系,从您获得If-Modified-Since资源的那一刻起,资源就在浏览器上,您决定是否让它保持原样。

我喜欢在这里说你们两个的想法。您似乎没有设置此标头,因此浏览器可能无法获取它。

为了使这个实际工作,你需要添加这一行

context.Response.AddHeader("If-Modified-Since", LastModifledOfImage.ToString()); 
Run Code Online (Sandbox Code Playgroud)

或者当您发送当前日期时间时:

context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString());
Run Code Online (Sandbox Code Playgroud)

当您发送图像时。我看到您使用了,SetLastModified但这是设置标题Last-Modified而不是您检查的标题。

如果可能的话,请考虑使该图像实际上静态化,因为即使这也会If-Modified-Since对服务器进行一次调用,但实际静态资源会直接从浏览器缓存获取图像,而无需询问服务器。