2012-11-06 11 views
5

Ich versuche, die meisten Funktionen des OutputCache-Aktionsfilters in MVC 4 wiederherzustellen, indem ich die Ergebnisobjekte selbst zwischenspeichern. Der Grund, warum ich den OutputCache-Aktionsfilter nicht verwenden möchte, ist, dass ich ihn nicht mit AppFabric und Teilansichten verwenden kann. Teilansichten werden immer in MemoryCache gespeichert und ich möchte, dass die zwischengespeicherten Objekte in einer Serverfarm verwendet werden.Caching von MVC-Ansichten in AppFabric manuell

Das erste Problem, das ich habe, ist

{"Type 'System.Web.Mvc.TempDataDictionary' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all of 
its members you want serialized with the DataMemberAttribute attribute. 
If the type is a collection, consider marking it with the 
CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for 
other supported types."} 

Das macht mich frage mich, ob ich etwas anderes zwischenspeichern soll zurückkehren, was am Ende im Wesentlichen die Aussicht ist. Hat jemand eine Vorstellung davon, was ich zwischenspeichern sollte, um die Ansicht neu zu erstellen, oder einen anderen Ansatz zum Zwischenspeichern von Teilansichten über eine Serverfarm? Ich möchte dafür keine Plugins von Drittanbietern verwenden.

Dank

Update: Ich begann die Darstellung der Teilansicht String Cachen wie folgt:

using (StringWriter sw = new StringWriter()) 
     { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "ViewName"); 
      ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      view = sw.GetStringBuilder().ToString(); 
     } 

Das es einfach nur rufen Sie die Zeichenfolge im Cache aus und senden es als Inhalt in das gemacht hat Aktion. Ich bin immer noch auf der Suche nach anderen Vorschlägen oder einem besseren Weg, dies zu tun.

Antwort

0

Vielleicht ein bisschen zu spät, aber lassen Sie mich mit Ihnen meine Erfahrung teilen.

Während ASP.NET MVC auf dem ASP.NET-Framework aufgebaut ist, hat es einige ziemlich signifikante Unterschiede, die die Wiederverwendung von ASP.NET-Features in MVC ziemlich schwierig gemacht haben. Sie sind wahr: Das vollständige Seitenausgabe-Caching und das partielle Seitenausgabe-Caching werden auf völlig unterschiedliche Weise implementiert. Eine andere blog post von Greg Roberts deutet darauf hin, dass es viele Probleme mit Output in MVC gibt. Es war so nützlich in WebForms!

Deshalb habe ich mich an MvcDonutCaching (Nuget) wandte. Es hat viele unserer Probleme gelöst. Bitte lesen Sie die Einleitung here oder codeplex.

Die gute Nachricht für Sie ist, dass MvcDonutCaching auch vollständig kompatibel mit AppFabric Caching ist; DevTrends hat vor ein paar Monaten einen article gepostet. Dies bedeutet, dass Sie den neuen Ausgabecache-Provider (in AppFabric 1.1 enthalten) verwenden können.

Das Hinzufügen dieses neuen Providers ist ziemlich einfach, da auf diese Weise eine Referenz hinzugefügt und die Konfiguration geändert wird.

<caching> 
    <outputCache defaultProvider="DistributedCache"> 
    <providers> 
     <add name="DistributedCache" 
      type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache" 
      cacheName="default" 
      dataCacheClientName="default" /> 
    </providers> 
    </outputCache> 
</caching> 

Hoffe, das wird dir helfen, denn es hilft uns sehr!

Verwandte Themen