Output caching using BOTH varibyparam and varybycustom

I'm trying to do something that should be very simple ... I have a website with a drop-down list from which the user selects a group. After that, the user navigates the site using the query arguments from the menu. So I want caching to depend on querystring - it seems to work. I also want the cache to depend on the group they selected.

But when the querystring is empty, none of the cache elements seem to work - the page is what it was for the last selected group. My cache directive looks like this:

<%@ OutputCache Duration="300" VaryByCustom="currentAtomId" VaryByParam="documentId;folderId;sectionId;renderMode;typeId" %>

My changeByCustom code looks like this:

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));
    }
}

Calling CurrentAtomId boils down to the following:

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;
}

Finally, the code that CurrentEntityId indicates is as follows:

    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);

I am puzzled. Any thoughts would be appreciated.

+5
1

- PAGE ( ), . ABOVE , . , try-catch VaryByCustomString Response.Write-it.

, , , , , ... , . , - .

: ByCustomString global.asax - .

+6

All Articles