Question

Je application multi-locataire dans ASP.NET MVC. L'instance de l'application qui sera servi est fonction du nom d'hôte seul (quelque chose le long des lignes de StackExchange, je suppose).

Chaque instance de l'application peut avoir un culture différente réglage (même "auto", lire la langue du navigateur et essayer de l'utiliser), et sera localisé en conséquence.

Dans cette situation, je voudrais faire quelques mise en cache de sortie sur certaines de mes actions. Donc, mes questions sont:

  1. Quelles sont les (possibilités pour réaliser la mise en cache de sortie d'une application ASP.NET MVC multi-locataire, si le sortie dépend exclusivement du nom d'hôte à savoir, en ignorant l'exigence de localisation)?

  2. Identique (1), mais en considérant maintenant que la sortie dépend des paramètres de culture et

  3. Identique (2), mais étant donné que la sortie peut varier avec des paramètres qui ont été passés à l'action?

Dans ce cas, je considère que tous les sites fonctionnent à partir d'un seul site Web IIS.

Était-ce utile?

La solution

Je viens compris comment y parvenir.

Il suffit d'utiliser la propriété VaryByHeader, mis à "host". Il y a beaucoup de possibilités de le faire.

Méthode 1

Utilisez la OutputCacheAttribute passant tous les éléments de configuration nécessaires, y compris VaryByHeader:

public class HomeController : Controller
{  
    [OutputCache(Duration = 3600, VaryByParam = "none", VaryByHeader = "host")]
    public ActionResult Index() { /* ... */ }
}

Méthode 2.

Ou vous pouvez définir à un profil sur le web.config:

<?xml version="1.0"?>
<configuration>
  <!-- ... -->
  <system.web>
    <!-- ... -->
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <clear/>
          <add name="Multitenant" 
               enabled="true"
               duration="3600"
               varyByHeader="host"
               varyByParam="none"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
  </system.web>
</configuration>

utilisez-le:

public class HomeController : Controller
{  
    [OutputCache(CacheProfile = "Multitenant")]
    public ActionResult Index() { /* ... */ }
}

Méthode 3.

Ou vous pouvez créer une sous OutputCacheAttribute et de l'utiliser:

public sealed class MultitenantOutputCacheAttribute : OutputCacheAttribute
{
    public MultitenantOutputCacheAttribute()
    {
        VaryByHeader = "host";
        VaryByParam = "none";
        Duration = 3600;
    }
}

utilisez-le:

public class HomeController : Controller
{  
    [MultitenantOutputCache]
    public ActionResult Index() { /* ... */ }
}

Autres conseils

Dans les cas atterrissez sur cette page et sont à la recherche de l'équivalent en asp.net 2.x. L'attribut ressemblera à ceci:

[ResponseCache(Duration = 30, Location = ResponseCacheLocation.Any, VaryByHeader = "host", VaryByQueryKeys = new string[] { "*" })]

Et vous aurez besoin du middleware ajouté. Vous avez besoin ce paquet NuGet et ce code:

public void ConfigureServices(IServiceCollection services)
{
    //stuff before...

    services.AddResponseCaching();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //stuff after...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //stuff before...

    app.UseResponseCaching();

    //stuff after...
}

Plus de détails ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top