2011-01-25 1 views
7

У меня есть простой частичный вид, что я рендеринга в моем главном экране с:ASP.Net MVC 3 Частичное страницу вывода Кэширование не чтит Настройки Config

@Html.Action("All", "Template") 

На мой контроллер у меня есть это:

[OutputCache(CacheProfile = "Templates")] 
    public ActionResult All() 
    { 
     return Content("This stinks."); 
    } 

И в моей конфигурации это:

<caching> 
    <outputCacheSettings> 
    <outputCacheProfiles> 
     <clear/> 
     <add name="Templates" duration="3600" varyByParam="none"/>  
    </outputCacheProfiles> 
    </outputCacheSettings> 
    <outputCache enableOutputCache="false" enableFragmentCache="false" /> 
</caching> 

Это произойдет сбой во время выполнения, за исключением:

Ошибка при выполнении запроса ребенка для обработчика «System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper

И внутреннее исключение:

Продолжительность должна быть положительным числом

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

[OutputCache(Duration = 3600)] 

Она будет работать, но и заметить в моем web.config я выключил enableOutputCache и enableFragmentCache, но не выполнять эти настройки.

Любопытно, что в нормальном режиме эти настройки работают нормально, так что же это о частичных представлениях, которые нарушают это? Я что-то упускаю? The Gu says this should work just fine... Короче говоря, он должен соблюдать настройки кэширования в web.config, а если нет, почему бы и нет?

+0

Duplicate: http://stackoverflow.com/questions/4728958/chaching-childactions-using-cache-profiles-wont-work – frennky

+0

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

ответ

5

Итак, я потратил минуту и ​​посмотрел на источник MVC 3. Первое, что пришло ко мне, это было немного взломанным. Главным образом потому, что они повторно используют атрибут, который работает в одной ситуации, соблюдая все свойства и настройки конфигурации, а затем в сценарии действий с детьми просто игнорируя все эти настройки и разрешая только VaryByParam и Продолжительность.

Как можно было бы разобраться, что поддерживается, вне меня. Поскольку исключение они хотят бросить, что говорит Неподдерживаемое не Setting никогда не бросят, если вы не поставляли продолжительность и значение VaryByParam

Вот основная часть кода, которая пахнет:

if (Duration <= 0) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidDuration); 
} 

if (String.IsNullOrWhiteSpace(VaryByParam)) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidVaryByParam); 
} 

if (!String.IsNullOrWhiteSpace(CacheProfile) || 
    !String.IsNullOrWhiteSpace(SqlDependency) || 
    !String.IsNullOrWhiteSpace(VaryByContentEncoding) || 
    !String.IsNullOrWhiteSpace(VaryByHeader) || 
    _locationWasSet || _noStoreWasSet) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_ChildAction_UnsupportedSetting); 
} 

I «Не знаю, почему это не вызвано в documentation, но даже если это было api, должно быть ясно или, по крайней мере, сделать правильное исключение.

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

Update: Я установил ток по крайней реализации внешнего минимума работе для моей ситуации с соблюдением включено флагом и позволяя профили кэша из web.config. Detailed in my blog post.

+0

много работы! спасибо, может быть немного переборщить за то, что мне нужно. ищу что-то основное –

0

Вот более простой подход, если:

  • Ваша основная цель состоит в том, чтобы иметь возможность отключить кэш во время отладки и позволяет во время развертывания
  • Вы не сложная политики кэширования
  • У вас нет сложной системы развертывания, которая опирается на синтаксис кэширования Web.config
  • Идеально, если вы используете XDT web transformations уже

Все, что я сделал, было создано новым атрибутом «DonutCache».

[DonutCache] 
public ActionResult HomePageBody(string viewName) 
{ 
    var model = new FG2HomeModel(); 

    return View(viewName, model); 
} 

К сожалению, вы можете инициализировать только [Attribute] с постоянным, так что вы должны инициализировать атрибут в его конструкторе. Примечание: Это не мешает вам устанавливать параметр variableByParam в объявлении [DonutCache].

class DonutCacheAttribute : OutputCacheAttribute 
{ 
    public DonutCacheAttribute() 
    { 
     Duration = Config.DonutCachingDuration; 
    } 
} 

Здесь я просто инициализирую атрибут из моего web.config с помощью статического свойства:

<appSettings> 
    <add key="DonutCachingDuration" value="5"/> 
</appSettings> 


public static class Config { 
    public static int DonutCachingDuration 
    { 
     get 
     { 
      return int.Parse(ConfigurationManager.AppSettings["DonutCachingDuration"]); 
     } 
    } 
} 

Тогда, конечно, вы можете использовать веб-преобразование XDT-х вы уже используете для измените это значение

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