Frage

Ich habe eine Multi-Tenant-Anwendung in ASP.NET MVC. Die Instanz der Anwendung, die bedient wird, ist abhängig von dem Hostname allein (etwas entlang der Linien von Stack, nehme ich an).

Jede Instanz der Anwendung könnte eine haben andere Kultur Einstellung (auch „auto“, der Browser-Sprache zu lesen und versuchen, es zu benutzen), und werden in lokalisierte entsprechend an.

In dieser Situation würde Ich mag einige Ausgabe-Caching tun auf einigen meiner Aktionen. Also, meine Fragen sind:

  1. Was sind die Möglichkeiten Ausgabe Caching eine Multi-Tenant ASP.NET MVC-Anwendung, wenn der Ausgang hängt ausschließlich von dem Hostnamen (dh zu erreichen, ignorieren der Lokalisierungsanforderung)?

  2. Wie (1), aber nun bedenkt, dass die Ausgabe auf den Kultureinstellungen abhängt und

  3. Wie (2), aber wenn man bedenkt, dass die Ausgabe mit Parametern variieren können: , die an die Aktion übergeben wurden?

In diesem Fall bin ich bedenkt, dass alle Webseiten, die auf einem einzigen IIS-Website ausgeführt werden.

War es hilfreich?

Lösung

Ich habe gerade herausgefunden, wie dies zu erreichen.

Sie einfach die VaryByHeader Eigenschaft verwenden, auf "host". Es gibt viele Möglichkeiten, dies zu tun.

Methode 1

Mit der OutputCacheAttribute alle benötigten Konfigurationselemente vorbei, einschließlich VaryByHeader:

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

Methode 2.

oder Sie können es zu einem Profil auf der Web.config einstellen könnte:

<?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>

Dann ist es verwenden:

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

Methode 3.

Sie können auch die OutputCacheAttribute Unterklasse und verwenden es:

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

Dann ist es verwenden:

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

Andere Tipps

Bei landen Menschen auf dieser Seite und suchen den entsprechenden Betrag in asp.net 2.x. Das Attribut wird wie folgt aussehen:

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

Und Sie werden die Middleware benötigen hinzugefügt. Sie müssen dieses nuget Paket und diesem 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...
}

Mehr Details hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top