2013-03-06 4 views
1

У меня есть следующий вопрос, касающийся OutputCache работы в любом ASP.Net или Composite C1 CMS (не знаю, где проблема):метод Переопределенный GetVaryByCustomString вызывается только по первому требованию на странице

мне нужно меняться cache by cookie с именем «Город». В Global.asax я переопределил метод GetVaryByCustomString.

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    var result = ApplicationLevelEventHandlers.GetVaryByCustomString(context, custom); 

    if (result == null) { 
     return base.GetVaryByCustomString(context, custom); 
    } 

    HttpCookie cookie = context.Request.Cookies["City"]; 
    string additionalVary = ""; 
    if (cookie != null) 
     additionalVary = cookie.Value; 
    else 
     additionalVary = "Москва"; 

    return String.Concat(result, additionalVary); 
} 

И проблема заключается в следующем: контрольная точка моего переопределенного метода GetVaryByCustomString идет удар только по первому требованию на страницу, но не попал по следующим запросам, пока кэш на самом деле, пока не истечет (60 секунд в моей дело). Хотя файл cookie мог быть изменен на стороне клиента за эти 60 секунд - страница просто берется из кеша.

Где я ошибаюсь? Спасибо заранее.

UPDATE: я наконец-то смог сделать OutputCache варьироваться в зависимости от печенья следующих изменений в настройках CacheProfile:

<outputCacheProfiles> 
    <add name="C1Page" duration="60" varyByCustom="C1Page" varyByParam="*" varyByHeader="Cookie" location="Server" /> 
</outputCacheProfiles> 

В этом случае метод GetVaryByCustomString идет удар по каждому запросу, но есть в этом нет необходимости: эти настройки делают кеш разным, поскольку каждый файл cookie может быть установлен на веб-сайте. Конечно, это не желаемое поведение - вот почему я продолжаю расследование.

Что еще более забавно - эти 2 параметра (variableByHeader = "Cookie" и location = "Server") работают только вместе, отключая один из них, делают вещи такими же, как и раньше - outputcache не меняется.

ответ

0

Попробуйте поставить точку прерывания на Application_BeginRequest, возможно, браузер не делает запрос, а показывает кешированную страницу.

+0

Пробовал в EndRequest - точка останова ударяется по каждому запросу. – user2138889

+0

См. Обновление в вопросе. – user2138889