Как вытащить ViewComponent за пределы действия кэшированного в ответе контроллера в ASP.NET Core

В целях повышения производительности мне нужно поместить действие домашней страницы в кэш и отобразить имя вошедшего в систему пользователя в заголовке домашней страницы. Я использовал для реализации devtrends/DonutOutputCache в классическом проекте ASP.NET. Эта система была очень полезна, потому что вы могли поместить целое действие в OutputCache, одновременно извлекая результаты частичного просмотра из кэша. У меня может быть 3 или 4 части, которые нуждаются в персонализации (опрос, аналитическая метка, имя пользователя и аватар, список статей на основе поведения...).

Знаете ли вы, могу ли я справиться с этим с помощью нового OutputCacheAttribute или CacheTagHelpers ASP.NET CORE?

На данный момент я поместил все данные HomePage в классический кеш-память.

Было бы здорово иметь такой TagHelper:

<cache expires-after="TimeSpan.FromMinutes(60)">
  @*Cached part*@
  <cache-hole>
   @*Refreshed on each page refresh. This could work with a ResponseCache attribute too.*@
   @await Components.InvokeAsync("UserProfile")
  </cache-hole>
</cache>

1 ответ

Решение

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

Если вы кэшируете всю свою страницу, у вас не может быть внутри какой-либо части, которая должна варьироваться для каждого пользователя. Вам просто нужно уменьшить объем того, что вы кешируете. Кэшируйте части страницы, которые не меняются, и это, по крайней мере, даст главной странице возможность отрисовки. Это то, что cache помощник тега для. Вы также можете кэшировать только для конкретного пользователя с помощью этого помощника тега:

<cache vary-by-user="true">
    <!-- user-specific stuff -->
</cache>

Это все равно будет отображаться несколько раз, но только один раз для каждого пользователя. После того, как он был кеширован для конкретного пользователя, будет использоваться кеш.

Другие вопросы по тегам