ASP.NET MVCフィルタの使用

3059 ワード

一.フィルタの理解
1.ASP.NET MVCでFilterAttributeAttributeから継承されるクラスを総称してフィルタと呼ぶ
2.Authorize HandlerError OutputCacheこれらのクラスは、FilterAttributeから直接または間接的に継承されています.
二.フィルタの一般的な分類
【1】承認[Authorize]
【2】エラー処理[HandlerError]
【3】キャッシュ[OutPutCache]
【4】カスタムフィルタ
三.フィルタの一般的なインタフェース
【1】IActionFilter動作方法の実行後にvoid OnActionExecuted(ActionExecutedContext filtercontext)を呼び出す
動作方法を実行する前にvoid OnActionExecuting(ActionExecutingContext filtercontext)を呼び出す
【2】IresultFilterは、動作結果の実行後にvoid OnResultExecuted(ResultExecutedContext filtercontext)を呼び出す
操作結果の実行前にvoid OnResultExecutionContext(ResultExecuttingContext filterContext)を呼び出す
【3】IExceptionFilter異常発生時にvoid OnException(ExceptionContext filterContext)を呼び出す
【4】IAuthorizationFilterは、許可が必要な場合にvoid OnAuthorization(AuthorizationContext filterContext)を呼び出す
四.エラー・ログ・フィルタのアクション・メソッド・フィルタのカスタマイズ
log 4 netを使用してログを記録し、プロファイルを自分で構成する
 
public class LogAndActionFilter:FilterAttribute,IActionFilter,IExceptionFilter

{

private static ILog log;

static  LogAndActionFilter()

{

     XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile));
     log = LogManager.GetLogger(typeof(AppLog));

}

public void OnException(ExceptionContext filterContext)

{

StringBuilder str=new StringBuilder();

str.Append(string.Format("  :{0}=====>",DateTime.Now.ToString()));

str.Append(string.Format("   :{0}     :{1}     ,     :{2}",filterContext.RouteData.Value["Controller"],filterContext.RouteData.Value["Action"],filterContext.Exception.Message));

log.Info=str;

}

public void OnActionExecuted(ActionExecutedContext filterContext)

{


string name=HttpContext.Current.Session["User"];

if(name==null)

{

 filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new Dictionary() { { "controller", "Home" }, { "action", "Index" } }), true);

return ;

}

}

}

または、ファイル・フローを使用してログを記録します.
 
public void OnException(ExceptionContext filterContext)

{

string path=filterContext.HttpContext.Server.MapPath(@"~\log.txt");

using(StreamWrite sw=File.AppendText(path))

{

sw.writeLine("====        ====");

sw.WriteLine("  :{0}",DateTime.Now.ToString());

sw.WriteLine(" {0}    {1}    ",filterContex.RouteData.Value["Controller"],filterContext.RouteData.Values["Action"]));

sw.WriteLine("     :{0}",filterContext.Exception.Message);

sw.WriteLine("========        ==========");

}

}


五.グローバル登録フィルタ
public class FilterConfig
{
public static void RegisterGlobalFilters(GloabalFiterCollection fiters)
{
filters.Add(new HandlerErrorAttribute())
}
}
六.フィルタの優先度の問題
Orderの使用
[LoginFilter(Order=1)]
[LoginFilter(Order=2)]
[LoginFilter(Order=3)]
小さい時から大きい時まで実行して、順序を逆順に並べ替えることができません