Estoy intentando hacer algo que debería ser muy simple ... Tengo un sitio con un menú desplegable del que el usuario selecciona un grupo. A partir de entonces, el usuario navega por el sitio utilizando los argumentos de la cadena de consulta de los menús. Así que quiero que el almacenamiento en caché dependa de la cadena de consulta, esto parece funcionar. También quiero que el caché dependa del grupo que seleccionaron.Caché de salida utilizando tanto varybyparam como varybycustom
Pero cuando la cadena de consulta está vacía, ninguno de los elementos de caché parece funcionar: la página es cualquiera que sea la versión del último grupo seleccionado. Mi directiva de caché es el siguiente:
<%@ OutputCache Duration="300" VaryByCustom="currentAtomId" VaryByParam="documentId;folderId;sectionId;renderMode;typeId" %>
Mi código VaryByCustom se ve así:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
switch (custom)
{
case "currentAtomId":
var currentAtomId = SecurityManifold.Create().CurrentAtomId;
var returnString = currentAtomId == null ? Guid.NewGuid().ToString() : currentAtomId.ToString();
return returnString;
default:
throw new ArgumentException(string.Format("Argument '{0}' is not a valid cache argument.", custom));
}
}
La llamada a CurrentAtomId se reduce a esto:
public static int? GetCurrentAtomIdFromContext(HttpContext context)
{
int entityId;
if (context.Session == null)
{
throw new InvalidOperationException("Session is null");
}
var sessionEntityId = context.Session["CurrentEntityId"];
if (sessionEntityId == null || string.IsNullOrEmpty(sessionEntityId.ToString()))
{
return null;
}
if (!int.TryParse(sessionEntityId.ToString(), out entityId))
{
return null;
}
return entityId;
}
Finalmente, el código que especifica el CurrentEntityId es este:
var selectedEntityId = this.lstSecurityEntities.SelectedValue;
if (string.IsNullOrEmpty(selectedEntityId))
{
return;
}
Session["CurrentEntityId"] = selectedEntityId;
var possibleQueryString = Request.QueryString.ToString();
if (!string.IsNullOrEmpty(possibleQueryString))
{
possibleQueryString = "?" + possibleQueryString;
}
Response.Redirect("default.aspx" + possibleQueryString);
Estoy desconcertado. Cualquier pensamiento sería apreciado.