MVC Action Filter

9879 ワード

ASP.NET MVC Frameworkでは、4つの異なるタイプのFilterがサポートされています.
Authorization filters–IAuthorizationFilter を実現する.
Actionfilters–IActionFilter を実現する.
Result filters–IResultFilter を実現する.
Exception filters–IExceptionFilter の属性を実現する.
Filterのデフォルトの実行順序は、上のリストの順序で行います.検証(authorization)Filterは常に最初に実行され、例外(exception)Filterは常に最後に実行されます.もちろん、必要に応じてOrderプロパティでフィルタの実行順序を設定することもできます.
 
ASP.NET MVC Frameworkには、いくつかのActionFilterが含まれています.
 
名前
説明
OutputCacheAttribute 
Web FormのOutputCacheコマンドと同様です.OutputCacheプロパティでは、MVC Frameworkでコントローラの出力をキャッシュできます.
ValidateInputAttribute 
Web FormのValidateRequestプロパティと同様です.MVCフレームワークでは、デフォルトでは、HTMLまたはその他の危険をチェックするために入力されるHTTPリクエストが入力されます.検出されると、異常が発生します.このプロパティを使用して、リクエスト検証を無効にします.
AuthorizeAttribute
Authorizeプロパティは、コントローラ操作の宣言的なライセンスチェックを行うことができます.このプロパティは、特定のロール内のユーザーの操作を制限します.このプロパティは、管理者ロール内のユーザーにのみ適用するアクションを作成する場合に使用できます.デフォルトで使用するASP.NETメンバーシップサービス、ASPを使用しない場合NETのMembershipサービスは、AuthorizeAttributeを継承し、実装を書き換えることができます.
ValidateAntiForgeryTokenAttribute
このプロパティは、サイト間での要求攻撃(CSRF)を防止するためのソリューションです.これにより、認証されたHTTP POSTが、ユーザ固有のタグであるFrameworkで使用できるようになります.CSRFsの詳細については、「ASPを使用する.NET MVC AntiForgeryToken()ヘルプ サイト間要求偽造防止(CSFR)」を参照してください.
 
 
 
 
 
 
 
 
 
 
 
検証(authorization)filterは、Authorize filterが検証filterの例であるように、controller actionでの検証と認可を実現するために使用される.
Actionfilterには、actionが実行される前または後の論理が含まれます.たとえば、action filterを使用してactionが返すview dataを変更することができます.
Result filterは、actionのview result実行の前後に使用されるいくつかの論理を含む.例えば、viewがブラウザに表示される前にview resultを変更することができます.
例外アクションは、例外情報を処理するために使用されます.また、例外フィルタを使用してエラー・ログを記録することもできます.
これらのfilterタイプは、指定した順序で実行されます.実行順序を制御する必要がある場合は、filterのOrderプロパティを設定する必要があります.
これらのクラスのベースクラスはSystemである.Web.Mvc.FilterAttributeクラスは、特定のfilterタイプを実装する必要がある場合、クラスを継承するクラスを作成し、1つ以上のIAuthorization、IActionFilter、IresultFilter、ExceptionFilterインタフェースを実装することができます.
 
Actionフィルタの作用範囲
ActionフィルタでActionメソッドをマークするほか、完了したコントローラクラスをマークすることもできます.この場合、このアクションフィルタはコントローラのすべてのアクションメソッドに適用されます.
また、コントローラクラスが他のコントローラクラスから継承されている場合、ベースコントローラクラスには独自のActionフィルタAttributesがある可能性があります.サブクラスでベースコントローラクラスのActionメソッドを書き換えると、サブクラスのこのActionメソッドには、ベースクラスから継承された独自のActionフィルタAttributesもあります.
 
Actionフィルタの実行順序
各アクションフィルタには、アクションフィルタの範囲内での実行順序を決定するOrderプロパティがあります.Orderプロパティは0(デフォルト)以上の整数値でなければなりません.Orderプロパティを省略すると、フィルタのOrder値は-1となり、順序が指定されていることを示します.同一範囲のActionフィルタOrderが-1に設定ものはいずれも不確定な順序で実行され、その前にフィルタには特定の順序がある(注:後述).
Orderプロパティの値を設定する場合は、一意の値を指定する必要があります.2つ以上のアクションフィルタが同じOrder属性値を持つ場合、例外が放出されます.
例を見てみましょう.
[Filter1(Order = 2)][Filter2(Order = 3)][Filter3(Order = 1)]public void Index(){    RenderView("Index");}
Filterの実行順序は、Filter 3=>Filter 1=>Filter 2である.
 
内蔵フィルタの概要
1OutputCacheAttribute
 
[OutputCache(Duration=10,VaryByParam="none")]
        public ActionResult TestCache() {
            ViewBag.Time = DateTime.Now.ToString();
            return View();
        }

 
上記のコードは動作方法にOutputCache特性を設け,ページにキャッシュ機能を持たせ,10秒キャッシュする.Cacheのプロパティはwebにもあります.configでの設定
<caching>
          <outputCacheSettings>
              <outputCacheProfiles>
                  <add name="outPutCache" duration="10" varyByParam="none"/>
              </outputCacheProfiles>
          </outputCacheSettings>
      </caching>

対応する動作方法
[OutputCache(CacheProfile="outPutCache")]
        public ActionResult TestCache() {
            ViewBag.Time = DateTime.Now.ToString();
            return View();
        }

2 AuthorizeAttribute
このクラスは主にページのメンバーとロール管理を実現し、AuthorizeAttributeクラスにはUsersとRolesの2つの属性が設定されており、それぞれメンバーとロールを表しています.
[Authorize]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

上記の動作方法にはAuthorizeプロパティが設定されており、この動作方法は登録され認証されたユーザーのみがアクセスできることを示しています.
[Authorize(Users="test1,test2")]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

上記の動作方法は、ユーザtest 1のみがアクセス可能であることを示しており、ユーザが多すぎる場合は、これらのユーザを一種類のロールに設定し、ロールパラメータを設定することによって設定することができる
  [Authorize(Roles="Admin")]
        public ActionResult TestAuthorize()
        { 
            return View();
        }

上記のアクションメソッドは、役割がAdminのユーザーのみがアクセスできることを示しています.
3 HandleErrorAttribute
このクラスは、Webサイトで指定されたコントローラまたはコントローラに関連するメソッドの異常処理を実現します.動作方法に[HandleError]特性を設定と、異常が発生した場合に自動的に異常処理ページに渡す、MVC 4では、プロジェクト作成時にGlobalに既に存在する.asaxにはグローバルなHandleError特性が追加されています
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

 

ActionFilterAttributeベースクラス


ユーザーがより簡単にカスタムアクションフィルタを作成できるように、ASP.NET MVC Frameworkは、IActionFilterおよびIresultFilterインタフェースを実装し、Filterクラスを継承するベースクラスActionFilterAttributeを提供する.
ここでの用語は完全に一致していないが,技術的には,このクラスはActionFitlerAttributeを継承し,action filterとresult filterインタフェースを同時に実現しているが,緩和的な意味ではASP.NET MVC Frameworkでは、filterを実装するタイプはすべてaction filterです.
ActionFilterAttributeクラスでは、次の方法で書き換えることができます.
OnActionExecution–コントローラアクションの実行前にを呼び出す
OnActionExecuted–コントローラアクションの実行後にを呼び出す
OnResultExecution–コントローラアクションresultが実行される前にを呼び出す
OnResultExecuted–Controller action result実行後にを呼び出す
以下に、これらの方法の実行順序を示します.
OnActionExecuting()-> Action execute & return View() ->OnActionExecuted() ->OnResultExecuting() -> Render View() ->OnResultExecuted()
カスタムアクションフィルタを作成する方法を説明するために、コントロールアクション処理の異なるフェーズのログ情報を記録し、Visual Studio出力ウィンドウに表示するカスタムアクションフィルタを作成します.
 
 public class LoginActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Log("OnActionExecuted",filterContext.RouteData);
            base.OnActionExecuted(filterContext);
        }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Log("OnActionExecuting", filterContext.RouteData);
            base.OnActionExecuting(filterContext);
        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Log("OnResultExecuted", filterContext.RouteData);
            base.OnResultExecuted(filterContext);
        }
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Log("OnResultExecuting", filterContext.RouteData);
            base.OnResultExecuting(filterContext);
        }
        private void Log(string methodName, RouteData routeData) {
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];
            var message = String.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);
            Debug.WriteLine(message,"Action Filter Log");
        }
    }

 
出力結果:
Action Filter Log: OnActionExecuting controller: Home action: Index
Action Filter Log: OnActionExecuted controller: Home action: Index
Action Filter Log: OnResultExecuting controller: Home action: Index
Action Filter Log: OnResultExecuted controller: Home action: Index

 
Filterアプリケーションの例:

ASP.NET MVC娱乐10、ActionFilter和内藏Filter实装(Instance-盗难防止检查)


ASP.NET MVC Action Filter-Cash和压缩