【问题标题】:HttpWebResponse LastModifiedHttpWebResponse LastModified
【发布时间】:2011-04-22 16:54:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# http httpwebresponse


    【解决方案1】:

    这取决于你的目的。

    Last-Modified 意味着服务器很高兴您继续使用具有相同 last-modified 值的实体(或稍后暗示,尽管服务器的 last-modified 回到过去会很奇怪,但在某些多服务器情况下可能会发生)。

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

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

    当然,两者都可能是完全错误的。错误发生。也就是说,当他们出错时,它更经常在另一个方向上,在没有发生变化时报告变化(一种有效的行为,允许对新鲜度过度谨慎;它从不损坏只会导致次优)。

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

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

    【讨论】:

    • 嗨 Jon,例如资源是 PDF 文件。 PDF 文件的实际最后修改日期是否与响应的最后修改日期相同?
    • 嗯,资源不是文件,而是“例如我们服务的当前文档”或 PDF 的任何用途。实体是文件(实际发送的内容),每个资源可以有多个实体(不同的语言、不同的内容类型、不同的压缩类型)。对于其中的每一个,您几乎总是将实体的最后修改时间与文件相同。在相对模糊的情况下,您可能会以不同的方式做事,但如果实体基于文件,您几乎总是会这样做。
    【解决方案2】:

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

    HTTP 响应标头由发送响应的 HTTP 服务器设置。是否设置 Last-Modified 响应标头,以及是否将其设置为准确值,完全取决于服务器。

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

    【讨论】:

    • 那么您认为我必须获取资源的哈希值吗?你知道其他方法吗?
    • @Jojo:请阅读HTTP/1.1, part 6: Caching。这真的很容易阅读。您对验证模型和新鲜度模型部分感兴趣。
    • 还有 ETag,如果存在,我更喜欢 Last-Modified。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多