2010-05-11 11 views
4

J'ai un site Web qui a un certain nombre d'en-têtes d'hôte. Le thème et les données dépendent de l'en-tête de l'hôte et différents hôtes chargent des sites différents. Alors, imaginons que j'ai un site Web appelé "Foo" qui renvoie les résultats de la recherche. Le même code exécute les deux sites répertoriés ci-dessous. Il est le même serveur et le site Web (en utilisant têtes d'hôte)Dans ASP.NET, est-il possible de sortir le cache par nom d'hôte? ie varybyhost ou varbyhostheader?

  1. www.foo.com
  2. www.foo.com.au

Maintenant, si je vais à .com, le site est le thème en bleu. Si je vais au site .com.au, c'est en rouge.

Et les données sont différentes pour le même résultat de recherche, en fonction du nom de l'hôte: résultats américains pour .com et résultats australiens pour .com.au.

Si je souhaite utiliser OutputCaching, cela peut-il être géré et partitionné par le nom d'hôte?

Je suis préoccupé que, après une personne va sur le site .com, (États-Unis retour correctement les résultats) qu'une deuxième personne visitant le site .com.au et de recherche pour les mêmes données seront obtenir le thème et les résultats pour le site .com.

La mise en cache est-elle possible?

+1

En plus des réponses; Je pense 'varyByHeader =" host "' devrait suffire, sans avoir besoin d'un custom-vary-by. – bzlm

+1

Copie possible de [cache de sortie ASP.NET MVC pour une application multinenant, varie selon le nom d'hôte et la culture] (http://stackoverflow.com/questions/2012072/asp-net-mvc-output-cache-for-multinenant-application- vary-by-hostname-and-cultu) – Michael

Répondre

7

Oui, vous pouvez "varier selon la coutume". J'utilise le même:

Placez les éléments suivants dans votre Global.asax.cs:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "Host") 
    { 
     return context.Request.Url.Host; 
    } 
    return String.Empty; 
} 

Ensuite, dans votre contrôleur:

[OutputCache(VaryByParam = "None", VaryByCustom="Host", Duration = 14400)] 
public ActionResult Index() 
{ 
    return View(); 
} 
+0

Fonctionne bien. Merci. – jesperlind

4

Vérifiez le paramètre VaryByCustom de la directive OutputCache.

Pour définir ce qui se passe quand VaryByCustom est appelé, vous devez remplacer la méthode GetVaryByCustomString:

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if(custom == "Your_Custom_Value") 
    { 
     // Do some validation. 
     // Return a string for say, .com, or .com.au 

    } 
    return String.Empty; 
} 

La clé est de renvoyer une valeur de chaîne pour chaque instance que vous voulez cache. Dans votre cas, votre méthode surchargée doit supprimer la partie ".com" ou ".com.au" de l'URL et la renvoyer. Chaque valeur différente produit un cache différent.

HTH

+0

Mec -qui aide vraiment. Si quelque chose, je peux maintenant passer du temps à faire des recherches sur ce sujet. Je reviendrai dans une semaine ou deux avec des réponses quand j'aurai du temps. Mais sérieusement - merci pour l'idée .. c'est très très très utile !! –

+0

Heureux que cela a été utile.En pensant simplement, vous pouvez utiliser HttpContext.Current.Request.Url.Host pour déterminer le nom d'hôte que l'utilisateur utilise pour se connecter à votre site. Vous pouvez ensuite rechercher cette chaîne pour la sous-chaîne '.com' ou '.com.au' et la renvoyer simplement - ASP.NET fera le reste. – Richard

+0

À la vôtre ... j'ai le nom d'hôte trié (parce que notre site est sur le thème par nom d'hôte). J'ai juste besoin d'un peu de temps pour R & D cela varie sur custom ... trop de travail ... –