2010-10-08 30 views
3

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

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

如果我只是检查HttpWebResponse.LastModified是否准确?

回答

5

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

HTTP响应头由发送响应的HTTP服务器设置。如果它设置了Last-Modified响应标题,并且它是否将其设置为准确值,它完全取决于服务器。

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

+0

那么你认为我将不得不获得资源的哈希值?你知道任何其他方式吗? – Jojo 2010-10-08 04:18:21

+0

顺便说一句,谢谢@dtb。那么,你知道任何其他方式吗? – Jojo 2010-10-08 04:20:38

+0

@Jojo:请阅读[HTTP/1.1,第6部分:缓存](http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-11)。这很容易阅读。您对验证模型和新鲜模型部分感兴趣。 – dtb 2010-10-08 04:21:12

3

这取决于你的目的。

Last-Modified将意味着服务器很高兴让您继续使用具有相同的最后修改值的实体(或者后面的含义,尽管服务器的最后修改时间会回到原来的位置会很奇怪,但可能发生在某些多服务器情况下)。

电子标签更强大(如果它不是“弱”电子标签,它更强大),因为它标识了特定的实体(不同语言版本,不同内容类型版本或不同内容的电子标签)编码版本将有所不同,除非它们实际上是相同的实体[在有限的情况下,它可以发生在])。

两者都可能是“宽松”的,或许服务器的变化被认为是微不足道的;服务器很高兴你继续使用以前的实体,因为它认为它是相同的(除了“强”的电子标签,它必须指示用于范围请求的八位字节到八位字节标识)。

这两者当然可以是明显错误的。错误发生。也就是说,当他们错误的时候往往在另一个方向上,在没有发生任何事情时报告变化(一种有效的行为,一种允许对新鲜度过于谨慎;从不损害只是次优)。

接下来的问题是您是否需要知道服务器认为没有更改(最常用)或者确实发生了更改(几乎局限于诊断工具)。

除非你有明确的理由不信任,相信最后修改和电子标签(但信任电子标签更多)。

+0

嗨乔恩,例如资源是PDF文件。 PDF文件的实际上次修改日期是否与回复的上次修改日期相同? – Jojo 2010-10-09 01:46:39

+0

那么,资源不是文件,而是“例如我们服务的最新文档”或任何PDF文件。实体是文件(实际发送的内容),每个资源可以有多个实体(不同的语言,不同的内容类型,不同的压缩类型)。对于其中的每一个,您几乎总是会将实体的最后修改时间与文件相同。在你可能以不同的方式做事情的相对晦涩的情况下,如果实体是基于文件的话,你几乎总是这样做。 – 2010-10-10 10:47:14