2012-02-16 5 views
11

Con il [OutputCacheAttribute] in ASP.NET MVC 3, è possibile cache di output con una buona dose di flessibilità. È utile sfruttare la proprietà 'VaryByHeader' per eseguire il caching del bucket in base al nome host. Ad esempio:VaryByHeader con OutputCacheAttribute sulle azioni bambino

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

Tuttavia, sulle azioni figlio, non è possibile applicare "VaryByHeader". Il quadro getta la seguente eccezione:

OutputCacheAttribute per le azioni del bambino supporta solo Durata, VaryByCustom e valori VaryByParam. Non impostare CacheProfile, Location, NoStore, SqlDependency, VaryByContentEncoding o Valori VaryByHeader per azioni figlio.

La mia domanda è, perché?

È il motivo per cui non è possibile VaryByHeader in un'azione figlio perché fornirebbe una varianza in conflitto, poiché l'azione principale potrebbe aver specificato un valore VaryByHeader diverso?

Se voglio mettere in cache le azioni del bambino in modo diverso basate su host, che cosa significa questo, e come potrei fare a questo proposito?

+0

Solo per curiosità, fare azioni bambino causare un altro HTTP ottenere? Forse i progettisti di questo hanno pensato che dal momento che non ci sia _second_ postback non ci sarebbe bisogno di memorizzare nella cache le intestazioni http differenti. –

+0

No, le azioni secondarie sono solo un'astrazione all'interno della stessa richiesta. –

risposta

13

VaryByHeader colpisce gli header HTTP effettivi di risposta; quindi probabilmente hai ragione sul fatto che il team MVC lo ha bloccato per evitare conflitti con l'azione principale.

Per memorizzare in cache in base al nome host, non è possibile utilizzare VaryByCustom? Qualcosa di simile (disclaimer: non ho provato questo a tutti):

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

seguito da (in 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

La memorizzazione nella cache basata sul nome host è già possibile utilizzando VaryByHeader. In uno scenario di hostname 2, ad esempio, l'azione figlio verrà memorizzata nella cache due volte, una volta per l'host A e una volta per l'host B. Non sarà necessario utilizzare VaryByCustom. (Anche se il tuo metodo funzionerebbe davvero, ed è probabilmente molto simile all'implementazione di VaryByHeader). –

+1

Ovviamente, ma dato che non puoi usare 'VaryByHeader' nella tua ChildAction ... :) – bhamlin