加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 如果内容是静态的,那么对于带有“If-Modified-Since

发布时间:2020-12-16 06:59:39 所属栏目:asp.Net 来源:网络整理
导读:在我们的Asp.Net应用程序中,我们有一个IHttpHandler处理图像请求. 使用特殊id调用Handler,该id标识图像缓存中的图像. 一旦图像投入现金,它就永远不会改变. 我的问题是: 是否可以在没有实际检查给定日期的情况下始终为具有“If-Modified-Since”标头的请求返
在我们的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,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,maxAge));
        context.Response.CacheControl = "private";
        context.Response.Cache.SetValidUntilExpires(true);

    }
}

解决方法

从你获得If-Modified的那一刻起它就可以了 – 因为资源在浏览器上,你决定是否让它保持原样.

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

要使这个实际工作,您需要添加此行

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

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

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

当你发送图像.
我看到you use the SetLastModified,但是这是设置Last-Modified标头而不是你检查的标头.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读