2017-07-11 2 views
10

je le code suivant dans mon contrôleur MVC:Utilisez OutputCache et GetVaryByCustomString à cache même contenu pour plusieurs chemins

[HttpGet] 
[OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "app")] 
public async Task<ViewResult> Index(string r) 
{ 
    // Stuff... 
} 

Et je la mise en œuvre suivante de GetVaryByCustomString dans ma classe Global.asax.cs:

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
     switch (arg.ToLower()) 
     { 
      case "app": 
       return context.Request.Url.Host; 

      default: 
       return base.GetVaryByCustomString(context, arg); 
     } 
    } 

Dans notre application, les clients auront leur propre sous-domaine (c.-à-johndoe.app.com, janedoe.app.com).

La mise en cache doit donc varier en fonction du sous-domaine. Cependant, tout "chemin" sur cette URL complète devrait partager le même cache. Donc, ce qui suit devrait lire le même cache de sortie:

  • johndoe.app.com/
  • johndoe.app.com/123
  • johndoe.app.com/abc

Il y a un raison épuisante pourquoi c'est comme ça, mais en bref, c'est une application SPA, et le "chemin" est vraiment juste un tracker. Cela ne peut pas être changé en une chaîne de requête.

Lorsque le chemin (tracker) change, la méthode d'index est à nouveau accessible. Je peux le dire à travers le débogueur. Comme une note, GetVaryByCustomString est encore appelé, mais il est appelé après que la méthode Index a été traitée.

Comment puis-je modifier le cache en fonction du sous-domaine, mais utiliser ce cache quel que soit le chemin (tracker) de l'URL?

Si elle offre quelque chose benefical, voici mes itinéraires MVC:

routes.MapRoute(
      name: "Tracker", 
      url: "{r}", 
      defaults: new { controller = "Home", action = "Index", id = "" }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

Version MVC 5.2.3, .NET 4.6.1

+0

Je ne sais pas si ce travail, mais ne peux pas vous implémentez GetVaryByCustomString comme filtre personnalisé si vous voulez être exécuté avant l'action d'index? –

+0

@RAHULSR Je ne pense pas. Vous devez le remplacer dans le fichier Global.asax.cs. Je pourrais mettre en œuvre une solution de mise en cache personnalisée, impliquant des filtres d'action, ou des gestionnaires Web globaux, ou quelque chose de similaire, mais ce ne serait pas idéal. – contactmatt

+0

Ajouter comment mettre dans le constructeur du contrôleur ?? s'il vous plaît partager votre réponse aussi je suis un peu curieux maintenant –

Répondre

1

Avez-vous essayé d'utiliser: VaryByHeader = "Hôte" ?

[HttpGet] 
[OutputCache(Duration = 3600, VaryByHeader = "Host")] 
public async Task<ViewResult> Index(string r) 
{ 
    // Stuff... 
} 

Plus d'informations comment faire de différentes façons dont vous pouvez trouver ici:

Output cache for multi-tenant application, varying by hostname and culture

+0

Variante par hôte est bon pour varier par sous-domaines et autres. Mais c'est le même domaine, protocole, etc., juste une variation dans les chemins. – contactmatt

+0

Vous n'y parvenez pas car tout sous-domaine est contrôlé par vos contrôleurs d'application SPA. Si vous aviez des parties en cache après le sous-domaine, cela signifierait que vous ne pouviez pas contrôler l'URL de votre application SPA. –

+0

@contactmatt J'ai trouvé une telle solution: https://techblog.dorogin.com/using-html5-appcache-with-single-page-applications-dc64f81e6b7e. Pouvez-vous envoyer des commentaires? –