سؤال

أثناء كتابة مخصص IHttpHandler جئت عبر السلوك الذي لم أكن أتوقع بشأن HttpCachePolicy الكائن.

مدربي يحسب مجموعات كيان الوسم (باستخدام SetETag الأسلوب على HttpCachePolicy المرتبطة الحالية استجابة الكائن).إذا كنت تعيين ذاكرة التخزين المؤقت-السيطرة على العامة باستخدام SetCacheability طريقة كل شيء يعمل مثل السحر و الخادم يرسل على البريد الوسم رأس.إذا أنا وضعت خاصة الإلكترونية الوسم رأس سيتم قمعها.

ربما أنا فقط لم يكن بدا من الصعب بما فيه الكفاية ولكن أنا لم أر أي شيء في HTTP/1.1 المواصفات التي تبرر هذا السلوك.لماذا لا تريد إرسال E-العلامة المتصفحات في حين لا تزال تمنع الوكلاء من تخزين البيانات ؟

using System;
using System.Web;

public class Handler : IHttpHandler {
    public void ProcessRequest (HttpContext ctx) {
        ctx.Response.Cache.SetCacheability(HttpCacheability.Private);
        ctx.Response.Cache.SetETag("\"static\"");
        ctx.Response.ContentType = "text/plain";
        ctx.Response.Write("Hello World");
    }

    public bool IsReusable { get { return true; } }
}

سيعود

Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 11

ولكن إذا كان لنا أن تغيير هذا العام سوف يعود

Cache-Control: public
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Etag: "static"

لقد تشغيل هذا على ASP.NET التنمية خادم IIS6 حتى الآن مع نفس النتائج.أيضا أنا غير قادر على تعيين صراحة ETag باستخدام

Response.AppendHeader("ETag", "static")

التحديث:من الممكن إلحاق ETag رأس يدويا عند التشغيل في IIS7, وأظن أن هذا هو سبب ضيق التكامل بين ASP.NET و IIS7 خط أنابيب.

التوضيح:انها مسألة طويلة ولكن السؤال الأساسي هو: لماذا ASP.NET تفعل هذا, كيف يمكن الحصول على من حوله و يجب علي ؟

التحديث:أنا ذاهب إلى قبول توني الجواب لأنه هو الأساس الصحيح (الذهاب توني!).لقد وجدت أنه إذا كنت تريد أن تحاكي HttpCacheability.خاصة بالكامل يمكنك تعيين cacheability إلى ServerAndPrivate ولكن لديك أيضا استدعاء ذاكرة التخزين المؤقت.SetOmitVaryStar(صحيح) وإلا ذاكرة التخزين المؤقت سوف تضيف تختلف:* رأس الإخراج و أنت لا تريد ذلك.سوف تحرير ذلك في الجواب عندما أحصل على تحرير الأذونات (أو إذا كنت ترى هذا توني ربما يمكنك تحرير الجواب أن تشمل تلك المكالمة؟)

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

المحلول

أعتقد أنك تحتاج إلى استخدام HttpCacheability.ServerAndPrivate

هذا يجب أن تعطيك cache-control:خاصة في رؤوس تتيح لك تعيين ETag.

الوثائق على أنه يجب أن يكون أفضل قليلا.

تحرير: ماركوس وجدت أن لديك أيضا استدعاء ذاكرة التخزين المؤقت.SetOmitVaryStar(صحيح) وإلا ذاكرة التخزين المؤقت سوف تضيف تختلف:* رأس الإخراج و أنت لا تريد ذلك.

نصائح أخرى

للأسف إذا نظرتم System.Web.HttpCachePolicy.UpdateCachedHeaders() في .صافي عاكس ترى أن هناك إذا كان البيان على وجه التحديد التحقق من أن Cacheability ليست خاصة قبل القيام بأي ETag الأشياء.في أي حال, لقد وجدت دائما أن Last-Modified/If-Modified-Since يعمل بشكل جيد على البيانات المتوفرة لدينا و هو أسهل قليلا رصد في عازف الكمان على أي حال.

إذا مثلي أنت راض عن الحل البديل المذكور هنا من استخدام Cacheability.ServerAndPrivate و كنت تريد حقا أن استخدام خاص بدلا من ذلك - ربما لأنك تخصيص صفحة على حدة للمستخدمين فإنه لا معنى ذاكرة التخزين المؤقت على الخادم ثم على الأقل .NET framework 3.5 يمكنك تعيين ETag من خلال الاستجابة.رؤوس.إضافة و هذا يعمل بشكل جيد.

N. B.إذا كنت تفعل هذا عليك أن تنفذ المقارنة بين العميل رؤوس نفسك HTTP 304 استجابة التعامل مع غير متأكد إذا .صافي يعتني هذا بالنسبة لك تحت الظروف العادية.

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