23

ASP.NETMVCにマルチテナントアプリケーションがあります。提供されるアプリケーションのインスタンスは、ホスト名のみの機能です(stackexchangeのラインに沿ったものだと思います)。

アプリケーションの各インスタンスは、異なるカルチャ設定(「自動」でさえ、ブラウザーの言語を読み取ってそれを使用しようとする)を持っている可能性があり、それに応じてローカライズされます。

この状況では、いくつかのアクションで出力キャッシュを実行したいと思います。だから、私の質問は次のとおりです。

  1. 出力がホスト名のみに依存している場合(つまり、ローカリゼーション要件を無視している場合)、マルチテナントASP.NET MVCアプリケーションの出力キャッシュを実現する可能性は何ですか?

  2. (1)と同じですが、出力がカルチャ設定にも依存することを考慮しますか?

  3. (2)と同じですが、アクションに渡されたパラメーターによって出力が異なる可能性があることを考慮しますか?

この場合、すべてのサイトが単一のIISWebサイトから実行されていると考えています。

4

2 に答える 2

57

私はこれを達成する方法を理解しました。

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() { /* ... */ }
}
于 2010-01-06T10:56:51.070 に答える
0

人々がこのページにアクセスし、asp.net2.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...
}

詳細はこちら

于 2018-11-30T17:42:16.803 に答える