2016-03-31 9 views
0

Sorun:Varlık Framework 6.1.3, 2 Web Uygulamaları 1 SQL Veritabanı, Tarayıcı Önbellek Sorunlar

olursa olsun benim işlemler kararlıyız ve uygulama veritabanından mutlak son okuyabileceği ne kadar emin

Bazen uygulamayı yenilediğimde değişiklikler en son verileri göstermiyor ve verilerin tarayıcıda önbelleğe alındığından şüpheleniyorum! Bu şüphe, değişiklikler yapıldıktan ve değişiklikler yapıldıktan sonra web uygulamasını başka bir tarayıcıya yüklemekten kaynaklanır. Sayfayı her yenilendiğinde, bu verilerin tarayıcıda önbelleğe alınmaması için bunu yapmam gerekiyor.


Kur: AJAX çağrıları, ekler, siler ve verileri günceller REST API istemci tarafında yapılırken

Bir Web Uygulaması basitçe, veritabanından okur. Ben çok araştırma ve bu konuda bulduk en değerli kaynağı yapıyor

buradaydı:

public IEnumerable<Link> GetLinks(){ 
    using (var context = new MyContext()){ 
     foreach(var link in context.ChangeTracker.Entries()) 
     { 
      link.Reload(); 
     } 
     return context.Links.Where(x => x.UserId == this.UserId).ToList(); 
    } 
} 

Bir örnek: http://mehdi.me/ambient-dbcontext-in-ef6/

veritabanından okur

Benim kod bu modeli kullanır Şimdi

public int AddLink(string text, string url) 
    { 
     using (var context = new MyContext()) 
     { 
      Link linkresult; 
      using (var contextTransaction = context.Database.BeginTransaction()) 
      { 
       var link = new Link() 
       { 
        Text = text, 
        Url = url 
        UserId = this.UserId 
       }; 

       linkresult = context.Links.Add(link); 
       context.SaveChanges(); 
       contextTransaction.Commit(); 
      } 
      return linkresult.Id; 
     } 
    } 

, yukarıdaki context.SaveChanges (gösterildiği gibi) contextTransaction.Commit ile() Ben: okur benim operasyonlarının birinin bu kalıbı izler Verilerin veritabanına yazıldığından ve herhangi bir düzeyde önbelleğe alınmadığından emin olmak. Bunu, Sunucu Gezgini'ni kullanarak ve içeriğin gerçek zamanlı olarak güncellenmesini izleyerek doğruladım.

Ayrıca, yaptığım değişikliklerin yapıldıktan sonra web uygulamasının başka bir tarayıcıda web uygulamasını yükleyerek veritabanından en yeni bilgileri alacağını doğruladığımı da düşünüyorum. Ancak, bunun bir önbellekleme sorunu olabileceğini de kabul ediyorum. farkında değilim.

Son adım, tarayıcıda gerçekleşen önbelleğe alma işlemine başlıyor. Chrome uygulamasının barındırılan verilerinizi temizlemenizi sağladığını biliyorum. Ancak, belirli bir veriye nasıl önbellekleme yapılacağını bilmiyorum, böylece her istekte bu kod yürütülür. REST API üzerinde


Detaylar: Yukarıdaki örneğin Kontrolör bu neredeyse özdeş bir şey arar:

public ActionResult AddLink(MyLink model) 
    { 
     IntegrationManager manager = new IntegrationManager(System.Web.HttpContext.Current.User); 
     model.Id = manager.AddLink(model.Text, model.Url); 
     return Json(model); 
    } 

IntegrationManager çünkü IDisposable uygulamıyor sadece temel sınıftır Her işlem sırasında içerik oluşturulur ve atılır. Görüldüğü gibi, AddLink, IntegrationManager sınıfının bir üyesidir.Web Uygulaması üzerinde


Detaylar: görünüm için bir model aşağıdaki gibi getLinks çağrı yapmak için geçici bir değişken olarak o kurucusunda bir IntegrationManager oluşturur:

public Home(IPrincipal user, Cache cache) 
    { 
     this.HttpCache = cache; 

     IntegrationManager _IntegrationManager = new IntegrationManager(user); 
     this.Links = this.GetLinks(_IntegrationManager); 

    } 

AJAX Arama:

  .on("click", "#btn-add-link", function (event) { 
       var text = $("#add-link-text"), 
        url = $("#add-link-url"); 

       if (text.val().length > 0 && url.val().length > 0) { 
        var hasHttp = /^http.*$/.test(url.val()); 
        if (!hasHttp) { 
         url.val("http://" + url.val()); 
        } 

        $.ajax({ 
         url: addLinkUrl, 
         type: "POST", 
         data: { Text: text.val(), Url: url.val() } 
        }).success(function (data) { 
         var newLink = $('<li class="ui-state-default deletable" id="link-' + data.Id + '"><a href="' + data.Url + '" target="_blank">' + data.Text + '</a></li>'); 

         $("#user-links").append(newLink); 

         text.val(""); 
         url.val(""); 

        }); 
+0

Görünümünüzü veya denetleyici kodunuzu gönderir misiniz? – esmoore68

+0

@ esmoore68 emin, birkaç dakika sürecek. –

+1

Eğer bir uyumsuz Http GET yaptığınızı söylüyorsa o zaman bu çok iyi olabilir. İçeriğin başlıkta ne kadar uzun olduğunu belirtebilir ve hatta URL'de rastgele bir ad/değer çifti uygulayabilirsiniz. Bu, tarayıcıya içeriğin farklı olduğunu ve sunucuya bir gezinin gerekli olduğunu söyleyecektir. JQuery'de bir özellik var, tarayıcının AJAX Get çağrıları için önbelleğe güvenmediğinden emin olmak için ayarlayabileceğine inanıyorum; ancak bu tarayıcıya ve tarayıcıya ait sürümlerin her zaman iyi bir şekilde belgelenmediğine inanıyorum. – Igor

cevap

0

Tamam, önbelleğe alma işleminin nasıl yapıldığından emin olun. Aşağıdaki, NoCache adı verilen web uygulamasının denetleyicisi için bir özniteliktir. Ben her şeye ihtiyacımız olup olmadığını

public class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 

     base.OnResultExecuting(filterContext); 
    } 
} 

Hala detaya arıyorum:

İşte
using whatever.namespace.nocache.lives.in 

[NoCache] 

özelliğinin ayrıntıları geçerli: Kullanmak için, Denetleyiciniz böyle niteliği gerekecektir Bu, sayfanın önemli ölçüde yükleneceği süreyi artırdığı için dahil edilir.