Кэш вывода для мультитенантного приложения, различающийся по имени хоста и культуре - PullRequest
23 голосов
/ 06 января 2010

У меня есть мультитенантное приложение в ASP.NET MVC. Экземпляр приложения, которое будет обслуживаться, является функцией только имени хоста (что-то вроде обмена стека, я полагаю).

Каждый экземпляр приложения может иметь настройку различную культуру (даже "авто", чтобы читать язык браузера и пытаться его использовать), и будет локализована соответственно.

В этой ситуации я хотел бы сделать кэширование вывода для некоторых из моих действий. Итак, мои вопросы:

  1. Каковы возможности для достижения кэширования вывода мультитенантного приложения ASP.NET MVC, если вывод зависит исключительно от имени хоста (т. Е. Игнорирование требование локализации)?

  2. То же, что (1), но теперь, учитывая, что вывод зависит также от настроек культуры ?

  3. То же, что (2), но с учетом того, что вывод может отличаться в зависимости от параметров , которые были переданы действию?

В этом случае я считаю, что все сайты запускаются с одного веб-сайта IIS.

Ответы [ 2 ]

57 голосов
/ 06 января 2010

Я только что понял, как этого добиться.

Просто используйте свойство VaryByHeader, установите "host". Есть много возможностей сделать это.

Метод 1

Используйте OutputCacheAttribute, передавая все необходимые элементы конфигурации, включая VaryByHeader:

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

Метод 2.

Или вы можете установить его в профиль на 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>

Тогда используйте это:

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

Метод 3.

Или вы можете создать подкласс OutputCacheAttribute и использовать его:

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

Тогда используйте его:

public class HomeController : Controller
{  
    [MultitenantOutputCache]
    public ActionResult Index() { /* ... */ }
}
0 голосов
/ 30 ноября 2018

Если люди заходят на эту страницу и ищут эквивалент в asp.net 2.x. Атрибут будет выглядеть так:

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

И вам понадобится промежуточное программное обеспечение. Вам нужен этот пакет nuget и этот код:

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...
}

Подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...