gpt4 book ai didi

asp.net - 如果内容是静态的,是否可以始终为 "If-Modified-Since"的请求返回 http 状态 304

转载 作者:行者123 更新时间:2023-12-02 12:22:07 24 4
gpt4 key购买 nike

在我们的 Asp.Net 应用程序中,我们有一个 IHttpHandler 处理图像请求。使用特殊的 id 调用处理程序,该 id 标识图像缓存中的图像。一旦图像被投入现金,它就永远不会改变。我的问题是:

是否可以始终为带有“If-Modified-Since” header 的请求返回 http 状态代码 304,而不实际检查给定日期?原因是浏览器必须已经有图像的副本(因为它提供了modified-since header )。

这会让生活变得更轻松,因为我们(尚未)跟踪图像创建日期。

这是实际的代码(更新:我现在按照 Aristos 的建议将 if-modified header 包含在服务器响应中):

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);

}
}

最佳答案

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

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

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

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

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

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

当您发送图像时。我看到you use the SetLastModified但这是设置 Last-Modified header 而不是您检查的 header 。

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

关于asp.net - 如果内容是静态的,是否可以始终为 "If-Modified-Since"的请求返回 http 状态 304,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11292882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com