Кэш для дочерних действий хранится в свойстве OutputCacheAttribute.ChildActionCache . Проблема заключается в том, что API, генерирующий идентификаторы для дочерних действий и сохраняющий их в этом объекте, не является общедоступным (ПОЧЕМУ Microsoft ??). Поэтому, если вы попытаетесь перебрать объекты в этой коллекции, вы обнаружите, что она также будет содержать кэшированное значение для вашего дочернего действия, но вы не сможете его идентифицировать, если не перепроектируете алгоритм, используемый для генерации ключей, которые выглядят как-то так (как видно с помощью Reflector):
internal string GetChildActionUniqueId(ActionExecutingContext filterContext)
{
StringBuilder builder = new StringBuilder();
builder.Append("_MvcChildActionCache_");
builder.Append(filterContext.ActionDescriptor.UniqueId);
builder.Append(DescriptorUtil.CreateUniqueId(new object[] { this.VaryByCustom }));
if (!string.IsNullOrEmpty(this.VaryByCustom))
{
string varyByCustomString = filterContext.HttpContext.ApplicationInstance.GetVaryByCustomString(HttpContext.Current, this.VaryByCustom);
builder.Append(varyByCustomString);
}
builder.Append(GetUniqueIdFromActionParameters(filterContext, SplitVaryByParam(this.VaryByParam)));
using (SHA256 sha = SHA256.Create())
{
return Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(builder.ToString())));
}
}
Чтобы вы могли совершить следующее безумие:
public ActionResult Invalidate()
{
OutputCacheAttribute.ChildActionCache = new MemoryCache("NewDefault");
return View();
}
, который, очевидно, сделает недействительными все кэшированные дочерние действия, которые могут быть не тем, что вы ищете, но, боюсь, это единственный способ, кроме, конечно, обратного инжиниринга генерации ключей: -).
@ Microsoft, прошу вас попросить ASP.NET MVC 4.0:
- вводит возможность делать кэширование пончиков в дополнение к кэшированию дырок от пончиков
- предоставляет возможность легкого истечения срока действия кэшированного контроллера (что-то более MVCish, чем
Response.RemoveOutputCacheItem
)
- предоставляет возможность легкого истечения срока действия кэшированного дочернего действия
- если вы выполните 1., тогда, очевидно, представьте возможность истечения срока хранения кэшированной части пончика.