Вопрос по iis-6, asp.net – программно управлять кешированием вывода - отключить или включить кеш в соответствии со значением параметра

20

У нас есть довольно стандартный сценарий электронной торговли с постраничными списками товаров в категориях. Что бы там ни было, около 80% посетителей никогда не переходят мимо первой страницы, в зависимости от категории может быть еще 5-10 страниц результатов, которые просматриваются гораздо реже. (Да, мы оптимизируем то, что отображается на первой странице, и имеем хороший поиск, но это другое обсуждение)

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

Я знаю, что мог бы сделать нечто подобное, используя объектное кэширование для хранения рассматриваемых наборов данных, но возможно ли это с помощью кэширования выходных данных, возможно, с помощью объекта response.Cache?

Где в жизненном цикле страницы это может быть сделано? Pre-рендеринга?

Проще говоря, URL-адрес выглядит как "/ ProductList? Category = что-то & amp; Страница = 1". И я хотел бы, чтобы логика была чем-то вроде (псевдокод):

<code>If paramater "Page" equals 1
   Use output caching: vary by param = "categoryName; page"
else
   Don't use caching at all, just render the page from scratch.
</code>

Мы используем ASP.NET 2.0 в IIS 6 / win2003.

Посмотрите на последний ответ наthis сообщение. Надеюсь, это поможет. James

Ваш Ответ

5   ответов
5

I like David Ebbo's answer a lot better than my own.

Вы могли бы использовать

<%@ OutputCache Duration="60"  VaryByParam="none" VaryByCustom="pageOne" %>

и реализовать его таким образом, чтобы он возвращал фиксированный ключ для первой страницы и случайный ключ для всех других страниц. Вы можете (иshould) пустьочистка механизм заботиться о памяти, но вы можете использоватьHttpResponse.RemoveOutputCacheItem удалить элементы кэша, если необходимо.

public override string GetVaryByCustomString(HttpContext ctx, string custom)
{
    if(custom == "pageOne")
    {
        if(ctx.Request["page"] == "1")
        {
            return "1";
        }

        HttpResponse.RemoveOutputCacheItem("/Default.aspx");
        return Guid.NewGuid().ToString();
    }
    return base.GetVaryByCustomString(ctx, custom);
}
4

HttpCachePolicy.AddValidationCallback

Увидетьhttp://www.hanselman.com/blog/AdvancedASPNETCachingAndAddValidationCallBack.aspx - Полный пример, который отвечает именно на этот вопрос.

1

и, на мой взгляд, вместо того, чтобы засорять код вашей страницы кучей гаек и болтов кеширования, вам лучше использовать многократно используемое решение, основанное на обработке этого в Global.asax, как обычно будет любой сценарий VaryByCustom.

Так, например, если вы используете пейджинговый подход с ретранслятором, вы можете просто в своем сценарии поиска захотеть исключить любую обратную передачу на определенной странице из кэша.Вот это пример кода, который делает именно это. Подход просто требует использования объекта HttpContext для доступа к Response.Cache.SetNoServerCaching () после перехвата любых критериев, для которых вы хотите избежать кэширования. Надеюсь, это поможет.

31

ое программно, как показано ниже:

if (yourArbitraryCondition) {
  OutputCacheParameters outputCacheSettings = new OutputCacheParameters();
  outputCacheSettings.Duration = 60;
  InitOutputCache(outputCacheSettings);
}

Делать это из OnInit должно работать нормально. И, очевидно, вы можете настроить поведение кэширования, установив различные свойства для OutputCacheParameter, который имеет все те же ручки, что и директива (фактически, это то, что мы генерируем, когда вы используете директиву).

Ключевым моментом является то, что вы выполняете эту логику только условно, в то время как директива делает ее безусловной.

UPDATE:

В качестве альтернативы вы можете использовать API низкоуровневого кэша, на котором построен приведенный выше код. например

HttpCachePolicy cache = Response.Cache;
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(Context.Timestamp.AddSeconds(60));
cache.VaryByParams["categoryName"] = true;

По сути, это еще один способ сделать то же самое, без использования каких-либо API, помеченных как «не должен называться». В конце концов, так или иначе будет работать, так что выбирайте.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededInitOutputCacheError: User Rate Limit ExceededEditorBrowsableState.NeverError: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/ms153473.aspx?
0

OutputCache d, irective со свойством VaryByParam, установленным в список строк, разделенных точкой с запятой, которые используются для изменения выходного кэша.

Если вы не хотели просто кэшироватьonly когда страница == 1?

Error: User Rate Limit Exceeded Andrew M

Похожие вопросы