Asp.net-mvc-caching

提供:Dev Guides
移動先:案内検索

ASP.NET MVC-キャッシュ

この章では、アプリケーションのパフォーマンスを向上させるために、キャッシングなどの最も一般的なASP.NET技術の1つに焦点を当てます。 キャッシュとは、パフォーマンスを向上させるために頻繁に使用されている何かをメモリに保存することを意味します。 出力キャッシュを活用して、ASP.NET MVCアプリケーションのパフォーマンスを劇的に改善する方法を説明します。

ASP.NET MVCには、適用できるOutputCacheフィルター属性があり、これはWebフォームの出力キャッシュと同じ概念です。 出力キャッシュを使用すると、コントローラーアクションによって返されたコンテンツをキャッシュできます。

出力キャッシュを使用すると、基本的に特定のコントローラーの出力をメモリに保存できます。 したがって、そのコントローラーで同じアクションを受信する今後の要求は、キャッシュされた結果から返されます。 これにより、同じコントローラーアクションが呼び出されるたびに同じコンテンツを生成する必要がなくなります。

キャッシュする理由

アプリケーションのパフォーマンスを改善するには、多くの異なるシナリオでキャッシュが必要です。 たとえば、従業員のリストを表示するASP.NET MVCアプリケーションがあるとします。 これで、ユーザーがコントローラーアクションを呼び出すたびにデータベースクエリを実行してこれらのレコードをデータベースから取得すると、インデックスビューが返されます。

したがって、出力キャッシュを利用して、ユーザーが同じコントローラーアクションを呼び出すたびにデータベースクエリを実行することを回避できます。 この場合、ビューはコントローラーアクションから再生成されるのではなく、キャッシュから取得されます。

キャッシュを使用すると、サーバーでの冗長な作業の実行を回避できます。

プロジェクトでのキャッシュの簡単な例を見てみましょう。

[OutputCache(Duration = 60)]
public ActionResult Index(){
   var employees = from e in db.Employees
   orderby e.ID
   select e;
   return View(employees);
}

ご覧のとおり、EmployeeControllerのインデックスアクションに「OutputCache」属性を追加しました。 この概念を理解するために、このアプリケーションをデバッガーモードで実行し、Indexアクションメソッドにブレークポイントを挿入しましょう。

OutputCache

次のURL http://localhost:63004/employee を指定し、「Enter」を押します。 Indexアクションメソッドでブレークポイントにヒットすることがわかります。

ブレークポイントがヒットしました

「F5」ボタンを押して続行すると、ビューから従業員のリストが表示され、データベースから取得されます。

取得した従業員のリスト

60秒以内にブラウザーを再度更新すると、今回はブレークポイントにヒットしないことがわかります。 これは、出力キャッシュを秒単位で使用したためです。 したがって、この結果は60秒間キャッシュされ、ブラウザーを更新すると、キャッシュから結果が取得され、データベースサーバーからコンテンツが読み込まれません。

期間パラメーターに加えて、出力キャッシュで使用できる他の設定オプションもあります。 これらの設定はMVCフレームワークだけでなく、ASP.Net Cachingから継承されます。

出力キャッシュの変更

場合によっては、詳細ページを作成し、詳細リンクをクリックすると選択した従業員の詳細が表示されるなど、さまざまなキャッシュバージョンが必要になる場合があります。

ただし、最初に詳細ビューを作成する必要があります。 このためには、EmployeeControllerからDetailsアクションメソッドを右クリックし、[ビューの追加…]を選択します

詳細ビューの作成

デフォルトで詳細名が選択されていることがわかります。 次に、[テンプレート]ドロップダウンから[詳細]を選択し、[モデルクラス]ドロップダウンから[従業員]を選択します。

テンプレートドロップダウン

[追加]をクリックして続行すると、Details.cshtmlが表示されます。

@model MVCSimpleApp.Models.Employee
@{
   Layout = null;
}

<!DOCTYPE html>
<html>
   <head>
      <meta name = "viewport" content = "width = device-width"/>
      <title>Details</title>
   </head>

   <body>
      <div>
         <h4>Employee</h4>
         <hr/>
         <dl class = "dl-horizontal">
            <dt>
               @Html.DisplayNameFor(model => model.Name)
            </dt>

            <dd>
               @Html.DisplayFor(model => model.Name)
            </dd>

            <dt>
               @Html.DisplayNameFor(model => model.JoiningDate)
            </dt>

            <dd>
               @Html.DisplayFor(model => model.JoiningDate)
            </dd>

            <dt>
               @Html.DisplayNameFor(model => model.Age)
            </dt>

            <dd>
               @Html.DisplayFor(model => model.Age)
            </dd>

         </dl>
      </div>

      <p>
         @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
         @Html.ActionLink("Back to List", "Index")
      </p>

   </body>
</html>

[OutputCache]属性のVaryByParamプロパティを利用できます。 このプロパティを使用すると、フォームパラメーターまたはクエリ文字列パラメーターが異なる場合に、まったく同じコンテンツの異なるキャッシュバージョンを作成できます。 詳細アクションの実装は次のとおりです。

//GET: Employee/Details/5
[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]

public ActionResult Details(int id){
   var employee = db.Employees.SingleOrDefault(e => e.ID == id);
   return View(employee);
}

上記のコードをコンパイルして実行すると、URL http://localhost:63004/employee を指定することにより、次の出力が表示されます。

新規作成

任意のリンクの[詳細]リンクをクリックすると、その特定の従業員の詳細ビューが表示されます。

特定の従業員の詳細

Details()アクションには、値「Id」を持つVaryByParamプロパティが含まれます。 Idパラメーターの異なる値がコントローラーアクションに渡されると、詳細ビ​​ューの異なるキャッシュバージョンが生成されます。

VaryByParamプロパティを使用するとキャッシュが増えることを理解することが重要です。 Idパラメーターの異なるバージョンごとに、詳細ビューの異なるキャッシュバージョンが作成されます。

キャッシュプロファイル

web.configファイルにキャッシュプロファイルを作成できます。 [OutputCache]属性のプロパティを変更することにより、出力キャッシュプロパティを構成する代わりになります。 次のようないくつかの重要な利点があります。

  • コントローラーアクションが1つの中央の場所にコンテンツをキャッシュする方法を制御します。
  • 1つのキャッシュプロファイルを作成し、そのプロファイルを複数のコントローラーまたはコントローラーアクションに適用します。
  • アプリケーションを再コンパイルせずにWeb設定ファイルを変更します。
  • 既に実稼働環境にデプロイされているアプリケーションのキャッシュを無効にします。

web.configファイルにキャッシュプロファイルを作成して、キャッシュプロファイルの簡単な例を見てみましょう。 <caching>セクションは、<system.web>セクション内に表示する必要があります。

<caching>
   <outputCacheSettings>
      <outputCacheProfiles>
         <add name = "Cache10Min" duration = "600" varyByParam = "none"/>
      </outputCacheProfiles>
   </outputCacheSettings>
</caching>

Cache10Minプロファイルは、次の[OutputCache]属性を使用してコントローラーアクションに適用できます。

[OutputCache(CacheProfile = "Cache10Min")]

public ActionResult Index(){
   var employees = from e in db.Employees
   orderby e.ID
   select e;
   return View(employees);
}

このアプリケーションを実行し、次のURLを指定します http://localhost:63004/employee

インデックスアクションの呼び出し

上記のようにIndex()アクションを呼び出すと、同じ時間が10分間返されます。