2011-07-21 10 views
5

Çok basit olması gereken bir şey yapmaya çalışıyorum ... Kullanıcının bir grup seçtiği bir açılır menüye sahip bir sitem var. Daha sonra, kullanıcı menülerden querystring argümanlarını kullanarak sitede gezinir. Bu yüzden önbelleğe alma işleminin sorgusuza bağımlı olmasını istiyorum - bu işe yarıyor. Önbelleğin, seçtikleri gruba bağımlı olmasını da istiyorum.BOTH kullanarak önbelleğe alma varibyparam ve değişkene özel

Ancak, querystring boş olduğunda, önbellek öğesi işe yaramıyor gibi görünüyor - sayfa, son seçilen grup için sürümün aynısı. Son olarak

public static int? GetCurrentAtomIdFromContext(HttpContext context) 
{ 
    int entityId; 

    if (context.Session == null) 
    { 
     throw new InvalidOperationException("Session is null"); 
    } 

    var sessionEntityId = context.Session["CurrentEntityId"]; 

    if (sessionEntityId == null || string.IsNullOrEmpty(sessionEntityId.ToString())) 
    { 
     return null; 
    } 

    if (!int.TryParse(sessionEntityId.ToString(), out entityId)) 
    { 
     return null; 
    } 

    return entityId; 
} 

belirten kod:

Benim VaryByCustom kodu şöyle
<%@ OutputCache Duration="300" VaryByCustom="currentAtomId" VaryByParam="documentId;folderId;sectionId;renderMode;typeId" %> 

:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    switch (custom) 
    { 
     case "currentAtomId": 
      var currentAtomId = SecurityManifold.Create().CurrentAtomId; 

      var returnString = currentAtomId == null ? Guid.NewGuid().ToString() : currentAtomId.ToString(); 

      return returnString; 

     default: 
      throw new ArgumentException(string.Format("Argument '{0}' is not a valid cache argument.", custom)); 
    } 
} 

CurrentAtomId çağrısı bu aşağı kaynar Benim önbellek yönergesi şöyle CurrentEntityId şudur:

var selectedEntityId = this.lstSecurityEntities.SelectedValue; 

    if (string.IsNullOrEmpty(selectedEntityId)) 
    { 
     return; 
    } 

    Session["CurrentEntityId"] = selectedEntityId; 

    var possibleQueryString = Request.QueryString.ToString(); 

    if (!string.IsNullOrEmpty(possibleQueryString)) 
    { 
     possibleQueryString = "?" + possibleQueryString; 
    } 

    Response.Redirect("default.aspx" + possibleQueryString); 

Şaşkınım. Herhangi bir düşünce takdir edilecektir.

cevap

6

Sonunda sorunu belirledim - çıktı önbelleğe alma bir PAGE seviyesine (kontrol seviyesinin aksine) yerleştirildiğinde, oturum mevcut değildir ve bir istisna atar. Küresel hata işleyicide Global YUKARIDAKİ'de bu istisna meydana geldiğinden, sessizce başarısız olur. Sonunda, VaryByCustomString ve Response.Write öğesinde önbellek anahtar oluşturma kodu etrafında bir try-catch bloğu silerek bunu çözdüm.

Ne pahasına olursa olsun ... her ne kadar olursa olsun, çözüm, önbelleklemeyi kontrol seviyesinde uygulamaktır; bu da maalesef, sayfa parçaları bir arada çalıştığı için çok daha fazla çalışmaktadır ... ancak önbelleklemeden daha iyidir. Umarım bu, bir başkasını bir süre daha kurtarmaya yardımcı olur.

Alt Satır: global.asax'ta değişkenByCustomString için - SESSION PAGE LEVEL'de ÖĞRENMEKTEDİR.

İlgili konular