2012-02-16 22 views
11

Dzięki [OutputCacheAttribute] w ASP.NET MVC 3, możesz wyprowadzać cache z dużą dozą elastyczności. Warto wykorzystać właściwość "VaryByHeader" do buforowania pamięci podręcznej według nazwy hosta. Na przykład:VaryByHeader z OutputCacheAttribute na akcje podrzędne

[OutputCache(Duration = 60, VaryByHeader = "host")] 
public ActionResult Foo() 
{ 
    return this.View(); 
} 

jednak na działania dzieci, nie można zastosować 'VaryByHeader'. Ramy rzuca następujący wyjątek:

OutputCacheAttribute działań podrzędnych obsługuje tylko czas trwania, VaryByCustom, a wartości VaryByParam. Nie ustawiaj wartości CacheProfile, Lokalizacja, NoStore, SqlDependency, VaryByContentEncoding lub VaryByHeader dla czynności podrzędnych.

Moje pytanie brzmi: dlaczego?

Czy jest to powód, dla którego nie możemy VaryByHeader w akcji podrzędnej, ponieważ zapewnia warunek sprzeczności, ponieważ akcja nadrzędna może mieć inną wartość VaryByHeader?

Jeśli chcę buforować czynności podrzędne w różny sposób w zależności od nazwy hosta, co to oznacza i jak mam się z tym pogodzić?

+0

prostu ciekawy, wykonaj czynności dziecko powodować inny HTTP dostać? Być może projektanci tego stwierdzili, że skoro nie ma już _second_ posta, nie byłoby potrzeby buforowania przez różne nagłówki HTTP. –

+0

Nie, czynności podrzędne to tylko abstrakcja w ramach tego samego żądania. –

Odpowiedz

13

VaryByHeader wpływa na rzeczywiste nagłówki HTTP Response; więc prawdopodobnie masz rację, że zespół MVC zablokował to, aby zapobiec konfliktom z działaniem nadrzędnym.

Do pamięci podręcznej opartej na nazwie hosta, nie można użyć numeru VaryByCustom? Coś podobnego (disclaimer: nie próbowałem tego w ogóle):

[OutputCache(Duration = 60, VaryByCustom = "host")] 
public ActionResult Foo() 
{ 
    return View(); 
} 

następnie (w Global.asax.cs)

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if (arg == "host") 
    { 
     return context.Request.Headers["host"]; 
    } 

    // whatever you have already, or just String.Empty 
    return String.Empty; 
} 
+1

Buforowanie na podstawie nazwy hosta jest już możliwe dzięki użyciu VaryByHeader. Na przykład w scenariuszu z 2 nazwami hostów akcja potomna będzie buforowana dwa razy, raz dla hosta A, a raz dla hosta B. Nie trzeba używać VaryByCustom. (Chociaż twoja metoda rzeczywiście by działała i prawdopodobnie jest bardzo podobna do implementacji VaryByHeader). –

+1

Oczywiście, ale ponieważ nie możesz używać 'VaryByHeader' w swojej ChildAction ... :) – bhamlin