Option 1
According to this answer, you just need to use VaryByParam = "*"
and it will automatically vary by the parameters you pass the action method.
[SiteIDs, OutputCache(VaryByParam = "*")]
public ActionResult SiteContent(string myID)
{
return Content(myID);
}
However, that may not work by using an IActionFilter
(haven't tried it). You might try using an IValueProvider
instead (which is a cleaner way to do what you are doing with the action filter, anyway).
Option 2
You could use VaryByCustom and GetVaryByCustomString to vary the cache by hostname.
[SiteIDs, OutputCache(VaryByParam = "none", VaryByCustom = "hostname")]
public ActionResult SiteContent(string myID)
{
return Content(myID);
}
And in your Global.asax
file:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "hostname")
{
return "HostName=" + context.Request.Url.Host;
}
return base.GetVaryByCustomString(context, custom);
}
}
Keep in mind your action filter will only be hit if the OutputCache
has not been set. So you need to vary the cache on the same value (or values) that you vary your ID
from. The simplest solution is to use something that is already in HttpContext
, such as host name.