2009-06-21 14 views
29

Yabancılığın içinde -İşlemiş Olduğu-Sonrasında herhangi bir pratik kullanımı biliyor musunuz? description'dan itibaren, bu üstbilginin kirli yazmalardan kaçınmaya yardımcı olması amaçlanmıştır. Yani, bu kaynağı yalnızca istemci ile mevcut olan son değiştirilen zamandan beri değiştirilmediyse güncelleyin. If-Modified-Since'ten farklı olarak, önbelleğe almada yardımcı olmaz. Bir şey mi eksik?If-Unmodified-Since HTTP Üstbilgisinin kullanımı nedir?

cevap

29

Örn. range request için.
örnek: istemciniz http://examp.le/foo?id=3 kaynağını ister ve İçindekiler uzunluğu 4096, ancak istemciniz yalnızca ilk 1024 bayt ister. Daha sonra (daha sonra) kalan 3072 bayt isteyebilir, ancak kaynak değiştiyse bu mantıklı değildir.

düzenleme: Ayrıca, kaynak bu sırada değiştiyse, verileri değiştirmek/güncelleştirmek istemeyebilirsiniz. Örneğin. Bir müşteri kaydı talep edersiniz ve bir şeyler düzenlersiniz. Bu sırada kayıt başka biri değiştiyse, bu tutarsızlığa neden olabilir. Bu nedenle, güncellemelerinizi bir if-unmodified-before (-I-alındı-the-data) başlığı ile gönderin ve web sunucusu, kayıt zaten değişmişse güncellemelerinizi reddeder/reddeder - müşteriniz daha sonra "çakışan" verileri talep edebilir.

edit2: "vahşi modda -Aşağıdaki değiştirilmemiş herhangi bir kullanımının": için http://msdn.microsoft.com/en-us/library/dd179371.aspx#Subheading1'a bakın.
İlk olarak requested the Blob properties olduğunu varsayalım. Şimdi sen biliyorsun, ör. İçerik türü ve İçerik uzunluğu (bir çeşit ayırma için buna ihtiyacınız olabilir). Ikinci, Get Blob isteği göndermeden önce birisi/bir şey blob değiştirebilir. Eğer Değiştirilmemiş-Sona Erdi başlığının değeri olarak Last-Modified değerini gönderirseniz, blob değiştiyse sunucu uygun hata koduyla cevap verecektir.


Bunlar, Son Değiştirilen üstbilginin değerinin koruma belirteci olarak işlev gördüğü eşzamanlılık denetimi aracı olarak iyimser bir kilit/damgalanmış kilit örnekleridir. Bakınız örn. https://en.wikipedia.org/wiki/Optimistic_concurrency_control

+0

İlk başta sadece "eşzamanlılık denetimi" idi. Menzil talepleri hakkında iyi yakalama! – rix0rrr

+0

Eşzamanlılık kontrolü için daha uygun. Bu cevabın neden bu kadar yüksek oyu aldığını bilmiyorum ama Range header, aralık talepleri için daha uygun. Örneğin. Aralık: bayt = 1024- – sotn

+0

@sotn OP, "vahşi-eğer-değiştirilmiş-beri pratik kullanımı" için sordu, bu yüzden bir cevap olarak bir kavram vermedi ama 2.5 eşzamanlılık kontrolü örnekleri. Ama belki haklısın; başka bir küçük paragraf ekleyecektir. – VolkerK

-3

Belirli bir yer için yerel hava durumunu gösteren bir uygulama geliştireceğinizi varsayalım. Eğer sunucu sadece gün içinde sadece 'x' kez hava durumu bilgisini güncellerse, tarayıcı o zaman diliminde bir http isteği yapmamaya dikkat edebilir (bir yenileme olsa bile).

2

Büyük indirmeler devam ederken yararlıdır.

8

Bir süre boyunca yürütülen ancak tek bir değişmemiş kaynağa ilişkin birden çok istek için kullanışlıdır.

Örnekler:

  • Menzil istekleri. Birinci aralık isteğine (veya belki bir ön HEAD) yanıt, Last-Modified başlığını içerir. Sonraki istekler, yalnızca bu kaynağın aynı sürümü içindir. Kaynak, aralık taleplerinin sırasını başlattığımız süre ile dizinin ortasında bir süre arasında değiştiyse, yeniden başlamak istiyoruz.

  • İyimser eşzamanlılık denetimi. İlk olarak GET kaynağı, istemci tarafında bazı değişiklikler yapın ve güncellenen kaynağı PUT'a yönlendirin. Ancak, bu arada hiç kimse güncellemediği sürece yalnızca PUT güncellemesini istiyoruz. Kimsenin değişikliklerinin üzerine yazmak istemiyoruz. Birisi bu arada kaynağı değiştirmişse, yeniden GET istiyoruz, istemcideki değişiklikleri (git rebase gibi) yeniden uygulamaya çalışın ve değiştirilen kaynağı PUT tekrar deneyin.

İlgili konular