لماذا لا يتم تسليم المخصص الخاص بي صورة التخزين المؤقت في المتصفح؟

StackOverflow https://stackoverflow.com/questions/963123

سؤال

لدي معالج مخصص يعيد صورة إلى المتصفح.

يتم جلب الصور من قاعدة بيانات.

لسبب ما لا يتم تخزين الصور من قبل المتصفح، وكنت أتساءل عما إذا كان شخص ما قد يكون قادرا على اكتشاف ما أفتقده من الرمز أدناه:

HttpContext.Current.Response.BinaryWrite(imageBytes);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
Context.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);
if(imgRepGetCache.DateCached.HasValue)
    HttpContext.Current.Response.Cache.SetLastModified(imgRepGetCache.DateCached.Value);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(2));
HttpContext.Current.Response.ContentType = "image/jpeg";

أو بدلا من ذلك، إذا فقدت النقطة بطريقة أو بأخرى، فهناك في مكان آخر أحتاج إلى إلقاء نظرة عليه.

يحرر: حسب الطلب لمزيد من المعلومات:

  • عنوان URL هو نفسه دائما
  • أقوم باختبار تحميل نفس الملف عبر أنبوب IIS القياسي وأنقلي في نفس المتصفح على نفس الكمبيوتر. الشخص الذي يتم تحميله من خلال IIS عادة مخزنة مؤقتا، وملفي ليس كذلك.

تحرير 2: بعد تفتيش طلبات / ردود HTTP على طريق IIS العادي، أعتقد أنه يحتوي على شيء له مع ETAG. يبدو أن ETAG (الذي أنا جديد فقط من الآن) هو نوع من المجموع الاختباري للمستند. عند الطلبات اللاحقة بواسطة متصفح يتم إرسال ETAG وإذا وجد الخادم لم يتم تغيير ETAG ثم إرجاع 304 - غير تعديل. الامور جيدة! لكنني الآن أعتبر ETAG باستخدام:

HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());

لكن هذا لا يظهر في الاستجابة. أقرب...

تحرير 3: لقد قمت بإصلاحها في النهاية بعد الاستفادة من Firebug لبعض المرح HTTP. لقد نشرت حلاي أدناه.

هل كانت مفيدة؟

المحلول

حسنا، أنا إصلاحه.

فيما يلي ما فعلته لأي شخص آخر ومعرفتي المستقبلية:

// Check for repeated request for the same image from a browser
if (HttpContext.Current.Request.Headers.Get("If-None-Match") == imgRepGetCache.DateCached.Value.ToString())
{
    // Return 304 - Not Modified
    HttpContext.Current.Response.Status = "304 Not Modified";
}
else
{
    if (imgRepGetCache.DateCached.HasValue)
        HttpContext.Current.Response.Headers.Set("Etag", imgRepGetCache.DateCached.Value.ToString());
    // ... do my other stuff here
}

يعمل سحر!

إذا بقع أي شخص أي مشاكل محتملة هنا، اسمحوا لي أن أعرف حتى أتمكن من تحديث هذا.

لاستباق واحد واضح الواضح - يمكنني الاعتماد بنسبة 100٪ في سلسلة التاريخ لتحديد ما إذا كانت الصورة جديدة أم لا (في سيناريو معين).

نصائح أخرى

أنت لا تذكر أي شيء في مشاركتك حول هذا الموضوع، ولكن هل هذا https: // العنوان؟ لا تستخدم المتصفحات الصور والصفحات من مواقع HTTPS بسبب أسباب الأمن.

الأشياء التي تحتاج إلى القلق بشأن جيل الاستجابة هي:

  • etag.
  • تنتهي صلاحيته

الأشياء التي تحتاج إلى القلق بشأنها عند تلقي الطلب هي:

  • آخر تعديل
  • إذا تطابق
  • إذا لم يكن أي مباراة
  • إذا تم تعديلها منذ ذلك الحين
  • إذا لم يتم إصلاحها منذ
  • ما لم يتم تعديلها منذ ذلك الحين

قد تحتاج أيضا إلى القلق بشأن طرق HTTP التالية:

  • احصل على
  • رئيس

فيما يلي حل يجب أن يكون سهلا إلى حد ما لاستعادلات احتياجاتك:http://code.google.com/p/talifun-web/wiki/staticfilehandler.

يقرأ الملفات من نظام الملفات وتضعها في ذاكرة التخزين المؤقت في الذاكرة، لذلك قم فقط بتغييره للقراءة من قاعدة البيانات. يجب أن تكون وظيفة سهلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top