HttpWebResponse LastModified

3

HttpWebResponse.LastModified准确吗?它是否总是存在?我的项目是创建一种专注于网络爬虫,如果我将使用资源的哈希值或仅使用HttpWebResponse.LastModified属性来检查资源的“新鲜度”,我就会陷入困境。

使用哈希值意味着每次检查资源时都要流式传输资源。这对整体性能有很大影响。

如果我只检查HttpWebResponse.LastModified,它准确吗?

2个回答

5

HttpWebResponse.LastModified返回HTTP响应头中Last-Modified的值。

HTTP响应头是由HTTP服务器发送响应时设置的。服务器完全可以自行决定是否设置Last-Modified响应头,以及是否将其设置为准确值。

Last-Modified响应头是HTTP缓存验证模型的一部分。通常与If-Modified-Since请求头一起使用。您可能需要阅读HTTP/1.1, part 6: Caching了解详细信息。


那么您认为我需要获取资源的哈希值吗?您知道其他什么方法吗? - Jojo
@Jojo:请阅读HTTP/1.1第6部分:缓存。它非常易懂。你可能会对验证模型和新鲜度模型这两个部分感兴趣。 - dtb
当存在时,我更喜欢ETag而不是Last-Modified。 - Julian Reschke

3

这取决于您的目的。

Last-Modified表示服务器允许您继续使用具有相同last-modified值(或者隐含地更晚)的实体(在某些多服务器情况下,服务器的last-modified可能会回退,但这很奇怪)。

E-tag更强大(如果它不是“弱”e-tag,则更加强大),因为它标识特定的实体(不同语言版本、不同内容类型版本或不同内容编码版本的e-tag将不同,除非它们实际上是相同的实体[在一组受限制的情况下,这是可能发生的])。

两者都可以“松散”,即可能认为服务器更改是不重要的;服务器愿意让您继续使用先前的实体,因为它认为它是相同的(除了“强”的e-tag,必须指示用于范围请求的八位字节身份)。

当然,两者都可能是错误的。出现错误是很常见的。尽管如此,在它们错误时,更常见的情况是报告发生了变化,而实际上没有发生变化(这是一种有效的行为,人们可以对新鲜度过于谨慎;它从不损坏,只是使次优)。

那么问题是,您是否需要知道服务器认为没有进行任何更改(大多数情况下),还是确实发生了更改(几乎只用于诊断工具)。

除非您有明确的理由不这样做,否则请相信last-modified和e-tag(但更相信e-tag)。


嗨Jon,例如资源是PDF文件。 PDF文件的实际最后修改日期是否与响应的最后修改日期相同? - Jojo
资源不是文件,而是“例如我们服务的当前文档”或者PDF等。实体是文件(实际发送的内容),每个资源可以有多个实体(不同语言、不同内容类型、不同压缩类型)。对于每个实体,你几乎总是将其最后修改时间与文件相同。虽然有一些相对较少见的情况可能需要采用不同的方法,但如果实体基于文件,则几乎总是这样做。 - Jon Hanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接