Подтвердить что ты не робот

Кэш вывода для приложения с несколькими арендаторами, изменяющийся по имени и культуре хоста

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Просто используйте свойство 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() { /* ... */ }
}

Ответ 2

В случае, если люди приземлятся на этой странице и ищут эквивалент в 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...
}

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