ASP.NET MVCフィルタの使用
一.フィルタの理解
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 FilterConfig
{
public static void RegisterGlobalFilters(GloabalFiterCollection fiters)
{
filters.Add(new HandlerErrorAttribute())
}
}
六.フィルタの優先度の問題
Orderの使用
[LoginFilter(Order=1)]
[LoginFilter(Order=2)]
[LoginFilter(Order=3)]
小さい時から大きい時まで実行して、順序を逆順に並べ替えることができません
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)]
小さい時から大きい時まで実行して、順序を逆順に並べ替えることができません