Часть инфраструктуры кэширования выходных данных - это механизм VaryBy, который позволяет указать, что ASP.NET поддерживает параллельные кеши одной и той же страницы, измененные некоторой частью данных, например, querystring. В этом случае механизм VaryByCustom может быть самым простым в реализации. Here's a short article with a good example.
Во-первых, атрибут кэширования:
[OutputCache(CacheProfile = "CachedPage")]
public ActionResult Index()
{
return View();
}
Профиль кэша:
<caching>
<outputcachesettings>
<outputcacheprofiles>
<add varybycustom="Language"
varybyparam="*"
duration="86400"
name="CachedPage" />
</outputcacheprofiles>
</outputcachesettings>
</caching>
И, наконец, эта логика в Global.asax.cs:
public override string GetVaryByCustomString(
HttpContext context,
string arg)
{
if (arg == "Language")
{
return Session["lang"].ToString();
}
else
{
return base.GetVaryByCustomString(context, arg);
}
}
сейчас для каждого возможного уникального значения, возвращаемого Session["lang"]
, ASP.NET будет хранить кешированный c opy страницы, которая выполняется под этим параметром.
я до этого читал что-то вроде этого, но это, кажется, не работает, он всегда кэширует результат. – MemoryLeak
@MemoryLeak при правильной реализации Я заверяю вас, что это работает очень хорошо. –
Я нашел Context.Session null, он не должен быть пустым! Что происходит ? – MemoryLeak