Можно варьировать кэширование вывода в зависимости от того, что вы хотите, используя VaryByCustom и предоставляя специальную функцию, которая будет возвращать строку ключа кэша. Для вашего случая попробуйте такую директиву:
<%@ OutputCache Duration="30" VaryByParam="myParam" VaryByCustom="mySessionVar" %>
Затем в Global.asax переопределите функцию GetVaryByCustomString для своего приложения:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if(arg == "mySessionVar" && Session["mySessionVar"] != null)
{
return Session["mySessionVar"].ToString();
}
return base.GetVaryByCustomString(context, arg);
}