【发布时间】:2013-11-04 10:57:41
【问题描述】:
我正在与 Owin 进行一些接近金属 HTTP 的纠缠。 我有一个输出 javascripts 的 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”。
问题是客户端不会再次调用 url,除非他们在浏览器中执行硬 F5。我对 Last modified 缓存的理解是每次都应该调用来检查内容是否被修改过?
更新:
控制:必须重新验证
- 铬
F5 和 ctrl+F5 将调用服务器,在新选项卡中打开站点或重新启动浏览器将调用服务器,在同一选项卡中键入地址将不会调用服务器。 If-Modified-Since 只在 Ctrl+F5 时清除,表示在内容未修改时可以正确返回 304
- IE10
F5 和 ctrl+F5 将调用服务器,在新选项卡中打开站点不会调用服务器,在同一选项卡中键入地址不会调用服务器。 If-Modified-Since 在执行 Ctrl+F5 或重新启动浏览器时清除
Cache-Control: no-cache 和 Pragma: no-cach
- 铬
会为每个操作调用服务器If-Modified-Since 仅在执行 Ctrl+F5 时清除
- 将为每个操作调用服务器
If-Modified-Since为重新启动浏览器和 Ctrl+F5 清除
结论
看起来no-cache 可能会更好,如果你想确保它每次都调用来检查304
【问题讨论】:
-
是否还会向客户端发送“max-age”或“expires”?这些可能会导致您看到的“不调用服务器,使用客户端缓存”行为
标签: c# caching http-headers owin