ASP.NET MVCでは、認証やキャッシュ、セキュリティなどの付加機能を、本体のロジックとは別に、属性としてアプリケーションに追加できる。
本連載では、.NET Frameworkの新たなアプリケーション・フレームワークであるASP.NET MVCを基礎から解説している。前回までで、Model−View−Controllerを構成する基本的な要素、そして、アクション・メソッドの挙動を制御するためのActionResultオブジェクトについて解説した。
今回扱うのは、(コントローラの)アクション・メソッドに付随的な機能を追加するためのフィルタ属性(FilterAttribute)である。
フィルタ属性を利用することで、アクション・メソッド、またはコントローラ・クラスに対して、認証や出力キャッシュ、セキュリティ対策といったさまざまな付随機能を、既存のロジックそのものには影響を与えることなく追加できる。
フィルタ属性は自分で定義することも可能であるが、まずは基本を押さえるという意味で、本稿ではASP.NET MVCが標準で備えるフィルタ属性(表1)について紹介していくことにしよう。
属性 | 概要 |
---|---|
AuthorizeAttribute | 認証機能を付与する |
HandleErrorAttribute | カスタム・エラー・ページを有効化する |
OutputCacheAttribute | 出力キャッシュ機能を有効化する |
ValidateInputAttribute | リクエスト・データの検証機能を有効化する |
ValidateAntiForgeryTokenAttribute | CSRF(Cross-Site Request Forgeries:クロスサイト・リクエスト・フォージェリ)対策を有効化する |
表1 ASP.NET MVC標準のフィルタ属性一覧 |
フィルタ属性は、その名前のとおり属性の一種で、コントローラ・クラス、もしくは個々のアクション・メソッドに対して指定できる。
まずは、フィルタ属性を適用した具体的なコードの例からだ。まだ個々のフィルタ属性について理解している必要はない。ここではフィルタ属性とはこのように書くものだ、という点に注目して次のコードを見てほしい。
[HandleError()] (1)
public class ResultController : Controller {
……中略……
[Authorize()]
[OutputCache(Duration=120, VaryByParam="*")] (2)
public String Dummy() {
……中略……
}
}
<HandleError()> _ (1)
Public Class ResultController
Inherits System.Web.Mvc.Controller
……中略……
<Authorize()> _
<OutputCache(Duration:=120, VaryByParam:="*")> _ (2)
Function Dummy() As String
……中略……
End Function
End Class
この場合であれば、HandleError属性(フィルタ)はResultコントローラ全体に対して適用されるが((1))、Authorize属性やOutputCache属性は、Result/Dummyアクションに対してのみ適用されることになる((2))。また、フィルタ属性は通常の属性と同様、コントローラ・クラス、アクション・メソッドいずれの階層に対しても、複数同時に適用することが可能だ。
複数のフィルタが同時に適用された場合には、
AuthorizeAttribute/ValidateInputAttribute/
ValidateAntiForgeryTokenAttribute
↓
OutputCacheAttribute
↓
HandleErrorAttribute
の順序で実行されることになる*1。また、同じ種類の属性が同時に適用された場合には、まずは記述順に優先されると考えておけばよいだろう(明示的に実行順序を強制する方法もあるが、これについてはあらためて後述する)。
*1 実際には、それぞれの属性がIAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilterインターフェイスのいずれを実装しているかどうかによる。
それでは、ここからは個々のフィルタ属性について見ていこう。
OutputCache属性を利用することで、ページ(アクション)に出力キャッシュ機能を追加できる。出力キャッシュといえば、「@OutputCacheディレクティブ」を思い出す方も多いかもしれないが、ASP.NET MVCでは@OutputCacheディレクティブは利用できないので、注意してほしい。
もっとも、OutputCache属性の概念は、@OutputCacheディレクティブによく似ているので、@OutputCacheディレクティブを理解しているならば、使い方で迷うことはないだろう。
例えば、Result/Currentアクションに対して、キャッシュ機能を有効にしたいならば、以下のようなコードを記述するだけでよい。
[OutputCache(Duration=120, VaryByParam="*")]
public String Current() {
return String.Format("現在時刻は{0}です。",
DateTime.Now.ToLongTimeString());
}
<OutputCache(Duration:=120, VaryByParam:="*")> _
Function Current() As String
Return String.Format("現在時刻は{0}です。", _
DateTime.Now.ToLongTimeString())
End Function
以下はこれを実行した例だ。
120秒以上経過してからリロードした場合のみ
OutputCache属性で指定できるプロパティは、次のとおりである。表1を見ても、@OutputCacheディレクティブの場合とほとんど使えるプロパティは変わらないことがお分かりいただけるはずだ。関連する記事についても併せて紹介しているので、理解を深めるための参考にしていただきたい。
表2 OutputCache属性で利用可能な主なプロパティ
Copyright© Digital Advantage Corp. All Rights Reserved.