2013-08-26 17 views
14

ASP.NET MVC iç işlevselliğine çok fazla (farklı nedenlerle) dalıyorum, ancak yine de tüm davranışları kapsayamam. Yapmadığımlardan biri subj.ASP.NET MVC Paketleme önbelleği. (Css dosyalarını değiştirerek) (iç davranış) (iç davranış)

Ben bazı dosyaları (örneğin css dosyaları), çerçeve bu değişiklikleri algılar ve yeni paket için yeni kimliği üretir paket if (yapmak:

Çalışma tarzı şudur href = "/ Content/css? v = qartPE4jGe-l1U0I7kNDZPZzVTdh0kT8VBZZA_uURjI1" gibi tarayıcıların değişiklikleri yenilemesi kolaydır. Aslında anlamaya çalışıyorum ne

:

  1. tam olarak nasıl çerçeve aktif hiçbir dizin gözlemcileri olduğu gibi ((yani muhtemelen MVC değil ama .NET şeyler) dosyaları değiştirildiğini tespit (dosyayı çevrimdışı olarak görüntülüyse bile dosyayı değiştirebildiğim için), dosya değişiklikleri değiştiğinde ve sistem aslında dosya içeriğini değiştirdiğini algılar (Sadece içeriğini yeniden kaydetmeden dosyaları yeniden kaydetmeye çalıştım ve Paket numarası da değişmedi))? (Açıkçası sistemin her dosya içeriğini karşılaştırarak her istekte bulunup bulunmadığını saptadığını düşünüyorum).

  2. (ve nasıl) çerçeveler saklar geçerli paket kimliği ve nasıl saklar önceki sürümleri (kendi URL'ler giderken önceki demetler halinde hala mevcuttur)?

Çok teşekkürler!

+1

Bu site paket mekanizma hakkında bazı bilgiler sağlar: http://www.dotnetexpertguide.com/2012/10/aspnet-45-mvc-4-revisiting-IBundleTransform-in-bundling.html İkinci sorunuz için, Varsayılan olarak, bir sunucu önbelleğinin kullanıldığı görülür. Paket kimliği, dosya içeriğinin bir karmaşasıdır, dolayısıyla içeriği değiştirdiğinizde değişir. Eski versiyonlar sunucuda saklanmaz ve artık mevcut değildir. URL, büyük olasılıkla çalışmaya devam edecektir (tarayıcıyı yeni bir şey indirmesi gerektiğini anlaması için kullanılan bir sorgu dizgesi olduğundan), ancak eski içeriği değil, yeni içeriği alırsınız. – Tommy

cevap

12

ASP.NET Optimizasyon çerçevesi, paket yanıtını HttpContext.Cache'da önbelleğe alır ve her bir dosyadaki değişiklikleri izlemek için bir CacheDependency kullanır. Bu nedenle dosyaların güncellenmesi önbelleği doğrudan geçersiz kılar ve paketi yeniden oluşturur.

Paket dosya adı, paket dosyalarından herhangi biri değiştirildiğinde URL'nin değişmesini sağlayan paket içeriğinin bir karmasıdır. Paketin sanal yolu önbellek anahtarı olarak kullanılır.

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); 
    } 
} 

Son olarak eski paket adreslerinin çalıştığını gelince, ben onlar bulacaksınız düşünüyorum:

kitaplığından ilgili kodu (bu tarih yakalamak çok zor ama mantık hala aynı olduğuna inanıyoruz dikkat edin) paket önbelleğinden döndürülür veya paket yolu değişmediğinden, yalnızca sürüm sorgu dizesi olduğundan, paketin en son sürümünü döndürür.

+0

Cevabınız için teşekkür ederiz. Ancak, sorunun iki bölümünün herhangi birine kesin bir cevap görmediğimden emin değilim. 1.İlgili dosya değişikliklerini tam olarak nasıl algılar? 2. Önbellek nerede (veya nasıl) gerçekten değerleri saklar? (birkaç demet halinde (eski ve yeni olanlar) varlığında). – Agat

+0

Cevabımı güncelledim ama kısacası, "CacheDependency" nesnesi değişikliklerin dosyalarını izler ve paket yanıtı anahtar olarak paket sanal yolunu kullanarak önbelleğe alınır (her paket için yalnızca bir giriş saklanır, böylece paket dosyaları kaldırılır. mevcut giriş). –

+0

Evet, ancak asıl soru, değişikliklerin dosyalarını tam olarak nasıl izler? Herhangi bir sistem gözlemcisi var mı (Uygulama çalışmıyorken ve dosyalar değiştiğinde durumun ne olduğu konusunda şüphem var)? Aksi halde, dosya değişikliklerini nasıl kontrol eder? Her istekte? – Agat