Различные политики кэширования сервера и клиента в ASP.NET 4.0 - PullRequest
5 голосов
/ 02 июня 2011

Мне не хватает фундаментального понимания кэширования вывода ASP.NET.

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

Однако клиенты должны регистрироваться один раз в час, чтобы получить то, что сервер считает самым свежим содержимым.установите мою продолжительность в 1 час, я знаю, что правильно устанавливает заголовок срока действия на клиенте.Но разве это также высвобождает серверный кеш?Есть ли способ гарантировать, что ответ будет храниться в кэше на сервере до тех пор, пока не изменится мой VaryByCustom, но при этом разрешить более частое истечение срока на стороне клиента?

1 Ответ

0 голосов
/ 05 августа 2011

Здесь важно отметить, что если ваш VaryByCustom изменяется, asp.net сохраняет отдельную кэшированную версию страницы.

Итак, предположим, что ваш VaryByCustom- "custom1" с Duration = "60", то это будет кэшироваться в течение 60 секунд.

Между тем, если ваш VaryByCustom изменится на «custom2» с длительностью = «60», asp.net будет хранить отдельную копию в кэше, которая отличается от кэша «custom1», и эта отдельная версия будет кэшироваться в течение 60 секунд.

Простой способ проверить это, изменив VaryByCustom на основе браузера.

В Global.asax

public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom == "browser")
            {
                string browserName;
                browserName = Context.Request.Browser.Browser;
                browserName += Context.Request.Browser.MajorVersion.ToString();

                return browserName;
            }
            else
            {
                return base.GetVaryByCustomString(context, custom);
            }

        }

Aspx

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebFormsPlayGround._Default" %>
    <%@ OutputCache Duration="40" VaryByParam="None" VaryByCustom="browser" %>

Загрузка страницы

protected void Page_Load(object sender, EventArgs e)
        {
            lblTime.Text = "The time now is: <br/>";
            lblTime.Text += DateTime.Now.ToString();
        }

Я не включил разметку для asp: Label в aspx, но я надеюсь, что вы поняли основную идею.

...