2015-04-20 10 views
4

У меня возникли странные проблемы с кешем и собрана очень простая .NET-страница с директивой кэша вывода. Однако страница не кэшируется (обновления содержимого при каждом обновлении).Директива .NET OutputCache не работает

У меня есть простой, минимальный сайт нашей CMS (Ektron v. 9.0 SP2), установленный на моем локальном компьютере (Windows 7). В рамках этого проекта веб-сайта я создал простую страницу для проверки выходного кэша. Вот код страницы:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CacheTest.aspx.cs" Inherits="CacheTest" %> 
<%@ OutputCache Duration="3600" Location="Server" VaryByParam="None" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Cache Test</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <p><%= DateTime.Now.ToString() %></p> 
    </div> 
    </form> 
</body> 
</html> 

Эта страница не кэширует вообще.

На нашей производственной площадке OutputCache вообще не работает, кроме одной тестовой страницы, которая настроена точно так же, как указано выше. Я не могу понять, почему эта страница отличается, и она единственная, которая работает на сервере dev, но при копировании на сайт, запущенный на моем локальном хосте, он больше не работает.

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

Где я могу начать искать эту проблему? Я просмотрел параметры IIS и не могу найти никаких очевидных настроек для включения/выключения кэширования на уровне страницы. Я также много раз искал в Интернете и не могу найти кого-либо еще с этой проблемой.

ответ

5

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

Существует обходное решение, которое удаляет файлы cookie с выхода. https://world.episerver.com/KB/10131/

В качестве альтернативы вы также можете использовать частичное кэширование страниц путем кеширования пользовательских элементов управления.

+0

Я пробовал обходной путь в ссылке, и он работал отлично, хотя мне пришлось добавить тест, чтобы проверить, является ли HttpContext.Current значением null в методе PreSendRequestHeaders, чтобы избежать получения исключений при отладке. Печеньки могут объяснить, почему он работает в некоторых ситуациях, а не на веб-сайте производства. – user0474975

+0

Обходной путь, что эта ссылка устранила проблему, но я не могу найти никакого официального объяснения о том, почему MS это сделала или это рискованное решение или нет. Есть идеи? – Lavamantis

+0

Вы хотите использовать кэширование вывода страницы, когда вы обслуживаете одну страницу для всех, кто посещает ваш сайт. Если вы обслуживаете какой-либо пользовательский контент на основе cookie или переменной сеанса, вы не хотите использовать этот код. Опасность состоит в том, что если вы обслуживаете разные материалы для людей на основе их файлов cookie, вы можете подать неправильный контент второму человеку, который обращается к странице. – maddoxej

0

Добавьте атрибут CacheProfile в своем определении,

<%@ OutputCache CacheProfile="CacheOneHour" Duration="3600" Location="Server" VaryByParam="none" %> 

Объявите профиль кэша в файле Web.config. (в system.web, разместить объявление):

<system.web> 
<caching> 
    <outputCacheSettings> 
    <outputCacheProfiles> 
     <add name="CacheOneHour" 
      duration="3600" 
      location="Server" 
      varyByParam="none"> 
    </outputCacheProfiles> 
    </outputCacheSettings> 
</caching> 
0

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

public static void StopCachingOfPage() 
     { 
      // Stop Caching in IE 
      HttpContext.Current.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); 
      // Stop Caching in Firefox 
      HttpContext.Current.Response.Cache.SetNoStore(); 
     } 

Так что просто ищите это в своем коде. Если вам понадобится кеширование, отмените этот вызов.

 Смежные вопросы

  • Нет связанных вопросов^_^