#asp.net #webforms #sitecore #ascx
#asp.net #веб-формы #sitecore #ascx
Вопрос:
Я добавляю литеральный элемент управления на мою страницу ascx
<asp:Literal ID="customLiteral" runat="server" />
Внутри метода Page_Load я динамически заполняю этот текст, используя HttpContext. Мне нужно прочитать некоторые файлы cookie, чтобы установить значение этого литерала.
customLiteral.Text = Utility.RenderText(HttpContext.Current) "<h3>" DateTime.Now.ToShortTimeString() "</h3>";
Это отлично работает при первой загрузке страницы. Но не попадает в мой метод renderText при последующих загрузках, поэтому не учитывает значение файлов cookie для отображения этого литерала. Я добавил значение даты для тестирования, и значение также остается постоянным. Будет ли литеральное значение каким-либо образом кэшироваться? Я также нажимаю точки останова внутри моей Page_Load только один раз при первой загрузке. Есть ли лучший способ достичь того, чего я хочу здесь?
Комментарии:
1. Что такое утилита? Маловероятно, что литерал кэшируется. Однако вы можете проверить это с помощью следующего: customLiteral. Text = DateTime.Now.toString();
2. Это одна из моих пользовательских функций, которая выполняет некоторую пользовательскую бизнес-логику для чтения файлов cookie и возврата строки. Я попробую ваш подход к дате. Хорошая идея. Спасибо
3. Неясно, литерал или пользовательский код выполняет предварительное кэширование? Я бы предложил; протестировать буквально с помощью DateTime. Если это пользовательский код, то покажите воспроизводимый пример.
4. Я добавил дату, а также обновил свой вопрос. Значение даты также не меняется после первой загрузки
5. Можете ли вы загрузить код для повторного создания этой проблемы? Я предполагаю, что Page_Load не содержит никакого кода, который мешает присваивать данные литералу, например IsPostBack? Также вопрос помечен Sitecore. Может ли это быть предварительным формированием кэширования? Если нет, может быть какая-то служба кэширования в web.config? Также вы можете создать пустую страницу веб-формы и добавить литерал, который назначает дату и время. — это проверка, есть ли кэширование по умолчанию.
Ответ №1:
Основываясь на вашей серии взаимодействий с Грегом, я подозреваю, что происходит какая-то форма кэширования выходных данных. Если это так, есть несколько способов получить любые данные, которые вы пытаетесь представить в режиме реального времени, и при каждой загрузке, чтобы они отображались при обновлении страницы.
Ключ к реализации приходит в виде чего-то, называемого заменой после кэширования (https://learn.microsoft.com/en-us/previous-versions/ms227429 (v = против 140)?перенаправлено из = MSDN) Этот метод также известен как «кэширование пончика», потому что, когда вы думаете о пончике, в нем есть отверстие, вырезанное посередине. Для сравнения: если бы выходные данные вашей HTML-страницы были пончиком, «дыра» в середине была бы местом, где вы хотите размещать свои выходные данные (ваш литеральный элемент управления) по требованию каждый раз, когда страница обслуживается, а не просто отображается в жизненном цикле страницы.
Подстановка после кэширования может быть выполнена полностью в коде, но я предпочел использовать элемент управления подстановкой ( https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.substitution?view=netframework-4.8 ) поскольку это немного облегчает понимание. Этот элемент управления состоит из двух логически отдельных частей. Есть раздел, который отвечает в обычном ASP.NET жизненный цикл страницы / элемента управления (например, Page_Load). Другая часть представляет собой общедоступный статический метод, который вызывается для элемента управления непосредственно перед отправкой обратно пользователю из выходного кэша. Этот статический метод — это то, где вы можете отображать содержимое того, что вы в данный момент пытаетесь отобразить с помощью вашего литерального элемента управления.
Я часто выступаю на конференциях и мероприятиях, посвященных кэшированию, и я разработал диаграмму последовательности, чтобы помочь моей аудитории понять, что происходит:
Обычно я работаю с SharePoint, и я реализовал это во многих сценариях с большим эффектом. Я надеюсь, что это работает для вас!
Комментарии:
1. Спасибо, Шон. Это действительно подробная и полезная информация! Я пытался использовать элемент управления подстановкой, но он отображается за пределами моего корневого компонента ascx при первой загрузке и не загружается при последующих загрузках. Похоже, что это не соответствует позиции в файле ascx, куда я добавил элемент управления заменой
2. Учитывая ваши результаты, @ManojSreekumar, я также склонен думать, что в игре есть еще что-то. Грег предположил, что может быть задействован Sitecore. Есть мысли по этому поводу? Я видел, как в одном конкретном случае неправильно генерировался элемент управления заменой, и именно тогда рендеринг на уровне страницы был переопределен пользовательской главной страницей. В этих случаях содержимое подстановки было отправлено в начале потока HTML, а не в нем. Без дополнительной информации я не уверен, что еще предложить. Я бы внимательно посмотрел на сквозной процесс для понимания.