2012-08-05 9 views
6

Ich versuche, einen kombinierten MongoDB/Memory-Ausgabe-Cache-Provider zur Verwendung mit MVC4 zu implementieren. Hier ist meine erste Implementierung:Auswählen des benutzerdefinierten Ausgabe-Cache-Providers für bestimmte Controller-Aktionen

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 Web-Config-Eintrag:

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

Und die Nutzung innerhalb von Homecontroller:

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

Mein Problem ist, wenn ich die Log-Datei für die überprüfen Schlüssel, die angefordert werden, sehe ich nicht nur die Anfrage an Heimcontroller, 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 festgestellt, dass ich den CustomOutputCacheProvider nicht als defaultProvider in Web.Config festlegen sollte, was ich nicht herausfinden konnte ist, wie man den Cache-Provider angibt, den ich für eine bestimmte Controller-Aktion verwenden möchte.

Mit Asp.Net Webseiten können Sie es erreichen, indem Sie <%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache" %> oben auf der Seite, aber für MVC die einzige Lösung, die ich finden konnte, ist HttpApplication.GetOutputCacheProviderName Method in Global.asax zu überschreiben.

Gibt es einen eleganteren Weg, dies mit dem Attribut [OutputCache] zu erreichen?

+0

Ein weiterer Vorschlag hinzugefügt! – bUKaneer

+0

Aus Interesse was ist "a2/test" und wie passt es in die ursprüngliche Anfrage 'a2 /'? –

+0

Keine Ahnung wirklich, was ich anfrage ist "http: // host/test". Mvc fügt das a2 hinzu (siehe [OutputCacheAttribute.cs] (http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/98d041ae352f#src%2fSystem.Web.Mvc%2fOutputCacheAttribute.cs)) während Sie den Schlüssel –

Antwort

5

Gibt es einen elegantere Weg, um den Output mit den Tasten [Output] Attribut zu setzen?

Ich denke, die Antwort ist nein, (auch nicht mit dem aktuellen mvc4 Release), da gibt es keine Beziehung zwischen einem benutzerdefinierten OutputCacheProvider Implementierung und der Dekoration einer Aktion mit dem OutputCache Attribute.

Wie Sie durch die Implementierung des benutzerdefinierten Providers und Protokollierung in der Get-Methode festgestellt haben, sehen Sie jede Anfrage an den Webserver gestellt. Wenn Sie das Attribut OutputCache aus all Ihren Aktionen entfernen, sehen Sie immer noch alle Anfragen in der Log-Datei. Ich dachte, die Antwort für diese ASP.NET MVC hits outputcache for every action war ziemlich nützlich, um das zu bestätigen.

Da es sieht aus wie Sie nur einen Ausgang-Cache-Provider implementieren möchten, dann denke ich, die einzige Möglichkeit ist, um nicht den Standardanbieter setzen und weiterhin die GetOutputCacheProviderName Implementierung außer Kraft zu setzen (wie Sie bereits erwähnt haben).so etwas wie dies vielleicht ausschließen alle Inhalt, Bilder und Scripts

public override string GetOutputCacheProviderName(HttpContext context) 
{ 
    string absolutePath = context.Request.Url.AbsolutePath; 

    if (absolutePath.StartsWith("/Content/", StringComparison.CurrentCultureIgnoreCase) 
     || absolutePath.StartsWith("/Scripts/", StringComparison.CurrentCultureIgnoreCase) 
     || absolutePath.StartsWith("/Images/", StringComparison.CurrentCultureIgnoreCase)) 
     return base.GetOutputCacheProviderName(context); 

    return "CustomOutputCacheProvider"; 
} 

Wenn Sie mehr als einen Ausgang-Cache-Provider implementieren müssen dann denke ich, werden Sie einen Helfer implementieren zu geben Sie den richtigen Anbieternamen. Aber hier ist ein Beispiel, wo ich die Routing-Daten für Sie gelöst habe; wo als das vorherige Beispiel direkt auf die URL schaute.

public override string GetOutputCacheProviderName(HttpContext context) 
{  
    RouteCollection rc = new RouteCollection(); 
    MvcApplication.RegisterRoutes(rc); 
    RouteData rd = rc.GetRouteData(new HttpContextWrapper(HttpContext.Current)); 

    if (rd == null) 
     return base.GetOutputCacheProviderName(context); 

    var controller = rd.Values["controller"].ToString(); 
    var action = rd.Values["action"].ToString(); 

    if (controller.Equals("Content", StringComparison.CurrentCultureIgnoreCase) 
     || controller.Equals("Scripts", StringComparison.CurrentCultureIgnoreCase) 
     || controller.Equals("Images", StringComparison.CurrentCultureIgnoreCase)) 
     return base.GetOutputCacheProviderName(context); 

    if (controller.Equals("Account", StringComparison.CurrentCultureIgnoreCase)) 
     return "AccountOutputCacheProvider"; 
    if (controller.Equals("Something", StringComparison.CurrentCultureIgnoreCase)) 
     return controller + "OutputCacheProvider"; 

    return "CustomOutputCacheProvider"; 
} 
+0

Nicht die Antwort, die ich suchte, aber die Verbindung half. Sieht so aus, als müsste ich meine eigene Lösung implementieren. –

1

Wenn ich wo Sie, würde ich versuchen, MyOutputCachAttribute von OutputCachAttribute geerbt, die Anbieter durch seinen Parameter auswählen wird.

+0

Ich habe darüber nachgedacht, aber es scheint, als ob fast gleiche Arbeit, meinen eigenen Caching-Mechanismus zu implementieren. Siehe [OutputCacheAttribute.cs] (http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/98d041ae352f#src%2fSystem.Web.Mvc%2fOutputCacheAttribute.cs) –

0

Überprüfen dieser Artikel von MSDN Magazine (mit Quellcode und Beispiele MongoDB & Azure als verteilten Cache-Provider Referenzierung) kann auch einen Einblick bieten http://msdn.microsoft.com/en-us/magazine/gg650661.aspx

EDIT

Können Sie die CacheProfile Einstellung angeben der Anbieter wie hier vorgeschlagen?

http://www.dotnetcurry.com/ShowArticle.aspx?ID=665

+0

Danke, schon gesehen, es hat das gleiche Problem. –

+0

Leider hat das CacheProfile nicht die Einstellung Provider festgelegt. –

Verwandte Themen