Auswählen eines benutzerdefinierten Ausgabe-Cache-Providers für bestimmte Controller-Aktionen

Ich versuche, einen kombinierten MongoDB / Memory-Ausgabecache-Provider für MVC4 zu implementieren. Hier ist meine erste Implementierung:

public class CustomOutputCacheProvider : OutputCacheProvider
{
    public override object Get(string key)
    {
        FileLogger.Log(key);
        return null;
    }

    public override object Add(string key, object entry, DateTime utcExpiry)
    {
        return entry;
    }

    public override void Set(string key, object entry, DateTime utcExpiry)
    {
    }

    public override void Remove(string key)
    {
    }
}

Und mein Webkonfigurationseintrag:

<caching>
  <outputCache defaultProvider="CustomOutputCacheProvider">
    <providers>
      <add name="CustomOutputCacheProvider" type="MyApp.Base.Mvc.CustomOutputCacheProvider" />
    </providers>
  </outputCache>
</caching>

Und die Verwendung innerhalb von HomeController:

[OutputCache(Duration = 15)]
public ActionResult Index()
{
    return Content("Home Page");
}

Mein Problem ist, wenn ich die Logdatei auf die angeforderten Schlüssel überprüfe, sehe ich nicht nur die Anforderung an den Home-Controller, sondern auch alle anderen Pfade:

a2/  <-- should only log this entry
a2/test
a2/images/test/50115c53/1f37e409/4c7ab27d/50115c531f37e4094c7ab27d.jpg
a2/scripts/jquery-1.7.2.min.js

Ich habe herausgefunden, dass ich den CustomOutputCacheProvider in Web.Config nicht als Standardprovider festlegen sollte. Ich konnte nicht herausfinden, wie der Cache-Provider angegeben wird, den ich für eine bestimmte Controller-Aktion verwenden möchte.

Mit Asp.Net-Webseiten können Sie dies mithilfe von ausführen<%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %> am oberen Rand der Seite, aber für MVC ist die einzige Lösung, die ich finden konnte, zu überschreibenHttpApplication.GetOutputCacheProviderName-Methode in Global.asax.

Gibt es eine elegantere Möglichkeit, dies mithilfe des Attributs [OutputCache] zu erreichen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage