2012-07-02 14 views
5

हमारे Asp.Net एप्लिकेशन में हमारे पास छवियों के लिए IHttpHandler हैंडलिंग अनुरोध हैं, तो "अगर-संशोधित-चूंकि" के अनुरोधों के लिए हमेशा http स्थिति 304 वापस करना ठीक है। हैंडलर को एक विशेष आईडी कहा जाता है जो हमारे छवि कैश में एक छवि की पहचान करता है। एक बार छवि को नकद में डाल दिया जाता है, यह कभी भी नहीं बदलता है। मेरा प्रश्न है:यदि सामग्री स्थिर है

क्या वास्तव में दिए गए दिनांक की जांच किए बिना "अगर-संशोधित-चूंकि" शीर्षलेख के अनुरोध के लिए हमेशा http स्थिति कोड 304 वापस करना ठीक है? तर्क यह है कि ब्राउजर में पहले से ही छवि की एक प्रति होना चाहिए (क्योंकि यह संशोधित-हेडर हेडर प्रदान करता है)।

इससे जीवन आसान हो जाएगा, क्योंकि हम छवि निर्माण तिथि को ट्रैक नहीं करते हैं (अभी तक)। आप If-Modified-Since संसाधन है मिल

public void ProcessRequest(HttpContext context) 
{ 
    if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"])) { 
     //Is this okay? 
     context.Response.StatusCode = 304; 
     context.Response.StatusDescription = "Not Modified"; 
     return; 
    } 
    var thumbnailId = context.Request.QueryString["thumbnail"]; 
    using (var thumbnailCache = new CThumbnailCache()) { 
     var imageBytes = thumbnailCache.GetImageById(thumbnailId); 

     context.Response.ContentType = "image/png"; 
     var outputStream = context.Response.OutputStream; 
     outputStream.Write(imageBytes, 0, imageBytes.Count()); 
     context.Response.Cache.SetCacheability(HttpCacheability.Public); 
     context.Response.Cache.SetLastModified(DateTime.UtcNow); 
     // added after Aristos post 
     context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("r")); 

     const int maxAge = 86400 * 14; // 14 Tage 
     context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(maxAge)); 
     context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, maxAge)); 
     context.Response.CacheControl = "private"; 
     context.Response.Cache.SetValidUntilExpires(true); 

    } 
} 
+0

और यदि आप कभी भी छवि को बदलना चाहते हैं तो क्या होता है? – nunespascal

+2

@nunespascal एक बदली गई छवि एक नई आईडी प्राप्त करेगी। –

उत्तर

3

ठीक है, पल से: (: के रूप में Aristos द्वारा सिफारिश की मैं जवाब में सर्वर अगर संशोधित हेडर अब शामिल अद्यतन)

यहाँ वास्तविक कोड है ब्राउज़र पर और आप तय करते हैं कि क्या आप इसे होने देते हैं।

मुझे यह कहना पसंद है कि आप दो सोचते हैं। ऐसा नहीं लगता कि आप इस हेडर को सेट करते हैं ताकि आप इसे ब्राउज़र द्वारा नहीं प्राप्त कर सकें।

इस वास्तविक काम करता है आप इस लाइन को जोड़ने की आवश्यकता बनाने के

context.Response.AddHeader("If-Modified-Since", LastModifledOfImage.ToString()); 

या आप वर्तमान दिनांक समय भेजते हैं के रूप में:

context.Response.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString()); 

जब आप छवि भेज। मुझे लगता है कि you use the SetLastModified लेकिन यह Last-Modified हेडर सेट नहीं है जिसे आप चेक करते हैं।

यदि संभव हो तो वास्तव में इस छवि को स्थिर करने पर विचार करें क्योंकि यह If-Modified-Since सर्वर पर एक कॉल करता है, लेकिन वास्तव में स्थिर संसाधन सर्वर से पूछने के साथ ब्राउज़र कैश से सीधे छवि प्राप्त करता है।

+1

हमारे सर्वर प्रतिक्रिया में शीर्षलेख शामिल करने के संकेत के लिए धन्यवाद। Spec के संदर्भ के लिए –

2

कल्पना द्वारा:

ग्राहक एक सशर्त GET अनुरोध प्रदर्शन किया जाता है गया है और उपयोग की अनुमति दी है, लेकिन दस्तावेज़ संशोधित नहीं किया गया, सर्वर यह स्थिति कोड के साथ जवाब देना चाहिए।

तो हाँ, ऐसा लगता है कि ये शर्तें संतुष्ट हैं। अपनी प्रतिक्रिया में दिनांक शीर्षलेख को फिर से शामिल करना सुनिश्चित करें।

+0

+1 –

संबंधित मुद्दे