2013-08-26 3 views
14

मैं एएसपी.नेट एमवीसी आंतरिक कार्यक्षमता में डाइविंग कर रहा हूं (विभिन्न कारण), लेकिन अभी भी सभी व्यवहार को कवर नहीं कर सकता है। उनमें से एक जो मैंने नहीं किया सबज है।एएसपी.नेट एमवीसी बंडलिंग कैश। (सीएसएस फाइलों का पता लगाने में परिवर्तन) (आंतरिक व्यवहार)

अगर मैं कुछ फ़ाइलों (उदाहरण के लिए सीएसएस फ़ाइलें), ढांचा उन परिवर्तनों का पता लगाता है और नए बंडल के लिए नए आईडी उत्पन्न करता है बंडल (बनाने के लिए:

तरह से यह काम करता है निम्नलिखित है ब्राउज़रों के लिए परिवर्तनों को रीफ्रेश करना आसान है) जैसे href = "/ content/css? v = qartPE4jGe-l1U0I7kNDZPZzVTdh0kT8VBZZA_uURjI1"।

क्या मैं वास्तव में समझने की कोशिश कर रहा हूँ:

  1. वास्तव में किस प्रकार फ्रेमवर्क (कि संभवतः MVC नहीं है लेकिन नेट सामान) पता लगाता है कि फ़ाइलें बदल रहे हैं (के रूप में वहाँ कोई निर्देशिका सक्रिय नजर रखने वालों कर रहे हैं (जैसा कि फ़ाइल बंद होने के लिए वेब-सर्वर होने पर भी मैं फ़ाइल को बदल सकता हूं), और सिस्टम वास्तव में फ़ाइल सामग्री में परिवर्तनों का पता लगाता है (मैंने केवल अपनी सामग्री को बदले बिना फ़ाइलों को फिर से सहेजने की कोशिश की है और बंडल संख्या के साथ-साथ नहीं बदली))? (मुझे लगता है कि स्पष्ट रूप से सिस्टम हर फ़ाइल सामग्री की तुलना नहीं कर सकता है ताकि प्रत्येक अनुरोध पर इसके परिवर्तनों का पता लगाया जा सके)।

  2. कहाँ (और कैसे) चौखटे भंडार वर्तमान बंडल आईडी और यह कैसे भंडार पिछले संस्करणों (पिछले बंडलों के रूप में जब उनके यूआरएल के लिए जाने के अभी भी उपलब्ध हैं)?

बहुत बहुत धन्यवाद!

+1

यह साइट बंडल तंत्र में कुछ अंतर्दृष्टि प्रदान करती है: http://www.dotnetexpertguide.com/2012/10/aspnet-45-mvc-4-revisiting-IBundleTransform-in-bundling.html आपके दूसरे प्रश्न के लिए, यह डिफ़ॉल्ट रूप से प्रकट होता है, कि एक सर्वर कैश का उपयोग किया जाता है। बंडल आईडी फ़ाइल सामग्री का हैश है, इस प्रकार जब आप सामग्री बदलते हैं तो बदल जाता है। पुराने संस्करण सर्वर पर संग्रहीत नहीं हैं और अब उपलब्ध नहीं हैं। यूआरएल सबसे अधिक संभावना है कि काम करेगा (क्योंकि यह सिर्फ एक क्वेरी स्ट्रिंग है जो ब्राउजर को एहसास करने के लिए इस्तेमाल किया जाता है कि इसे कुछ नया डाउनलोड करने की आवश्यकता है) लेकिन आपको पुरानी सामग्री नहीं, नई सामग्री मिल जाएगी। – Tommy

उत्तर

12

एएसपी.नेट अनुकूलन ढांचा HttpContext.Cache में बंडल प्रतिक्रिया को कैश करता है और परिवर्तन के लिए बंडल में प्रत्येक फ़ाइल की निगरानी के लिए CacheDependency का उपयोग करता है। यही कारण है कि फ़ाइलों को अद्यतन करना सीधे कैश को अमान्य करता है और बंडल को पुन: उत्पन्न करता है।

बंडल फ़ाइल का नाम बंडल सामग्री का हैश है जो यूआरएल परिवर्तनों को सुनिश्चित करता है जब किसी भी बंडल फ़ाइलों को संशोधित किया जाता है। बंडल का आभासी पथ कैश कुंजी के रूप में उपयोग किया जाता है।

पुस्तकालय से प्रासंगिक कोड (ध्यान दें कि यह थोड़ा पुराना हो चुका है, लेकिन मेरा मानना ​​है कि तर्क अभी भी एक ही है):

internal BundleResponse GetBundleResponse(BundleContext context) 
{ 
    // check to see if the bundle response is in the cache 
    BundleResponse bundleResponse = Bundle.CacheLookup(context); 
    if (bundleResponse == null || context.EnableInstrumentation) 
    { 
     // if not, generate the bundle response and cache it 
     bundleResponse = this.GenerateBundleResponse(context); 
     if (context.UseServerCache) 
     { 
      this.UpdateCache(context, bundleResponse); 
     } 
    } 
    return bundleResponse; 
} 

private void UpdateCache(BundleContext context, BundleResponse response) 
{ 
    if (context.UseServerCache) 
    { 
     // create a list of all the file paths in the bundle 
      List<string> list = new List<string>(); 
     list.AddRange(
      from f in response.Files 
      select f.FullName); 
     list.AddRange(context.CacheDependencyDirectories); 
     string cacheKey = Bundle.GetCacheKey(context.BundleVirtualPath); 
     // insert the response into the cache with a cache dependency that monitors 
     // the bundle files for changes 
     context.HttpContext.Cache.Insert(cacheKey, response, new CacheDependency(list.ToArray())); 
     context.HttpContext.Response.AddCacheItemDependency(cacheKey); 
     this._cacheKeys.Add(cacheKey); 
    } 
} 

अंत में पुराने बंडल यूआरएल काम करने के लिए के रूप में, मुझे लगता है कि आप वे मिलेगा या तो आपके ब्राउज़र कैश से वापस आ गए हैं या वास्तव में बंडल का नवीनतम संस्करण वापस कर रहे हैं क्योंकि बंडल पथ नहीं बदलता है, केवल संस्करण क्वेरी स्ट्रिंग।

+0

उत्तर के लिए धन्यवाद। हालांकि, मुझे यकीन नहीं है कि मैं प्रश्न के दो हिस्सों में से किसी एक के सही जवाब देखता हूं। 1।संबंधित फाइलों में यह कितना सटीक पता लगाता है? 2. जहां (या कैसे) कैश वास्तव में मूल्यों को स्टोर करता है? (कई बंडलों (पुराने और नए) अस्तित्व के मामले में)। – Agat

+0

मैंने अपना जवाब अपडेट कर दिया है लेकिन संक्षेप में, 'कैश पर निर्भरता' ऑब्जेक्ट परिवर्तनों के लिए फ़ाइलों पर नज़र रखता है और बंडल प्रतिक्रिया को बंडल वर्चुअल पथ का उपयोग करके कुंजी के रूप में कैश किया जाता है (प्रत्येक बंडल के लिए केवल एक प्रविष्टि संग्रहीत होती है ताकि बंडल फ़ाइलों को हटाया जा सके मौजूदा प्रविष्टि)। –

+0

हां, लेकिन मूल प्रश्न यह है कि यह परिवर्तनों के लिए फ़ाइलों की निगरानी कैसे करता है? क्या कोई सिस्टम वॉचर मौजूद है (मैं उस पर संदेह कर रहा हूं, जैसा कि ऐप नहीं चल रहा है और फाइलें बदली गई हैं) के बारे में क्या है? अन्यथा, यह फाइल संशोधन की जांच कैसे करता है? हर अनुरोध पर? – Agat

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