2009-06-21 58 views
29

您是否知道If-Unmodified-Since在野外的任何实际用途? 从description看来,此标题旨在帮助避免脏写入。即只有在自客户端可用的上次修改时间以来尚未修改的情况下才更新此资源。与If-Modified-Since不同,它似乎不能帮助缓存。我错过了什么吗?If-Unmodified-Since HTTP Header有什么用途?

回答

29

您可以使用它,例如为range request
示例:您的客户端请求资源http://examp.le/foo?id=3,并且内容长度为4096,但您的客户端仅请求前1024个字节。然后它可以(稍后)请求剩余的3072个字节,但如果资源在此期间发生了变化,那么这是没有意义的。

编辑:如果资源已经改变,您也可能不想更改/更新数据。例如。您请求客户记录并编辑一些内容。如果其他人在此期间更改了记录,则可能会导致不一致。因此,使用if-unmodified-since(-I-retrieve-the-data)标题发送更新,如果记录已更改,则Web服务器将/应拒绝更新 - 客户端可以请求“冲突”数据。

edit2:既然您已要求“If-Unmodified-Since the wild”的任何实际用途: 请参阅http://msdn.microsoft.com/en-us/library/dd179371.aspx#Subheading1
我们假设你已经第一个requested the Blob properties。现在你知道例如内容类型和内容长度(也许你需要这种分配)。在发送第二个,Get Blob请求之前,某人/某物可能会更改该blob。如果您发送Last-Modified的值作为If-Unmodified-Since标题的值,则服务器将在适当的错误代码下作出响应,如果blob发生变化。


这些是作为并发控制手段的乐观锁/加盖锁的示例,其中Last-Modified标头的值用作防护标记。见例如 https://en.wikipedia.org/wiki/Optimistic_concurrency_control

+0

我第一次,虽然只是“并发控制”。很好地了解范围要求! – rix0rrr 2009-06-21 12:41:59

-3

假设你正在开发一个应用程序,显示给定地点的当地天气。如果服务器每天只更新天气信息'x'次,那么浏览器可以注意不要在该时间范围内发出http请求(即使有刷新)​​。

2

恢复大量下载时很有用。

8

对于在一段时间内进行的多个请求有用,但与单个未更改的资源有关。

例子:

  • 范围请求。对第一个范围请求(或者初步HEAD)的响应包括Last-Modified标题。后续请求仅适用于该资源的相同版本。如果资源在我们开始范围请求序列的时间和序列中间的某段时间之间发生了变化,我们希望重新开始。

  • 乐观并发控制。我们首先为GET一个资源,在客户端进行一些更改,并希望PUT更新资源。但只要PUT更新的资源,只要没有其他人在此期间更新它。我们不想覆盖任何人的变化。如果事实证明有人在此期间更改了资源,我们希望再次尝试GET,尝试重新应用客户端中的更改(类似于git rebase),并尝试再次更改资源PUT