MVCカスタムフィルタ(Filter)ルーティング制御、例外処理、認可処理(クライアント情報取得)を実現
6800 ワード
MVCカスタムフィルタ(Filter)は、ルーティング制御、例外処理、認可処理(クライアント情報取得)を実現することができる
Controllerは、IActionFilter、IAuthorizationFilter、IExceptionFilterなどのいくつかのフィルタインタフェースを実現するので、クラスをカスタマイズしてこれらのインタフェースを実現する、FilterConfig.csファイルにこれらのフィルタを登録して接面制御を実現し、具体的なコードは以下の通りである.
FilterConfig.cs
Controllerは、IActionFilter、IAuthorizationFilter、IExceptionFilterなどのいくつかのフィルタインタフェースを実現するので、クラスをカスタマイズしてこれらのインタフェースを実現する、FilterConfig.csファイルにこれらのフィルタを登録して接面制御を実現し、具体的なコードは以下の通りである.
FilterConfig.cs
// , HandleError ( HandleErrorAttribute )
filters.Add(new SystemIExceptionFilter(), 1);
//
filters.Add(new SystemIActionFilter(), 2);
//
filters.Add(new SystemIAuthorizationFilter(), 3);
ルーティングアクセスフィルタpublic class SystemIActionFilter : IActionFilter
{
//
// Summary:
// Called after the action method is invoked.
// Action
// Parameters:
// filterContext:
// Information about the current request and action.
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
//
// Summary:
// Called before the action method is invoked.
// Action
// : RedirectToRouteResult
// RouteName
// RouteValues Permanent
// true
// Parameters:
// filterContext:
// Information about the current request and action.
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//
string tempAction = filterContext.RouteData.Values["action"].ToString();
string tempController = filterContext.RouteData.Values["controller"].ToString();
string tempLoginAction = filterContext.RouteData.Values["action"].ToString();
if (tempAction == "HomeLogin" && tempController == "Home" || tempLoginAction == "UserLogin" ? false : true)
{
//
if (tempAction == "UserLogin" && tempController == "Home" ? false : true)
{
//Cookie
HttpCookie tempToken = filterContext.HttpContext.Request.Cookies["exclusiveuser_token"];
if (tempToken == null)
{
filterContext.Result = new RedirectToRouteResult("HomeLogin", new RouteValueDictionary(new { controller = "Home", action = "HomeLogin" }), false);
}
// token null token , , ,cookie
if (tempToken == null ? false : true)
{
//UserToken token token ,token ,cookie
string SystemToken = new SecondTrackToken().UserToken();
if (SystemToken == null)
{
filterContext.Result = new RedirectToRouteResult("HomeLogin", new RouteValueDictionary(new { controller = "Home", action = "HomeLogin" }), false);
};
}
}
}
}
}
例外処理フィルタ public class SystemIExceptionFilter : IExceptionFilter
{
void IExceptionFilter.OnException(ExceptionContext filterContext)
{
Exception exception = filterContext.Exception;
if (filterContext.ExceptionHandled)
{
return;
}
HttpException http = new HttpException(null, exception);
/*
* filterContext.Exception.Message
*/
string messager = filterContext.Exception.Message;
/*
*
*/
Log4NetHelp help = new Log4NetHelp();
help.ErrorString(filterContext.Exception.Message);
/*
* ,
*/
filterContext.ExceptionHandled = true;
/*
* , ISS7.0
*/
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
承認処理(クライアント情報の取得) public class SystemIAuthorizationFilter : IAuthorizationFilter
{
void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
{
//
string pcName = ((System.Web.HttpServerUtilityWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Server).MachineName;
//
string action = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ActionName;
//
string controller = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ControllerDescriptor.ControllerName;
//
string time = filterContext.RequestContext.HttpContext.Timestamp.ToString();
//
string absturl = ((System.Web.UnvalidatedRequestValuesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Unvalidated).Url.AbsoluteUri;
//
string code = ((System.Web.HttpResponseWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Response).Status;
//
string browser = ((System.Web.HttpBrowserCapabilitiesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Browser).Type;
//
string gepPost = ((System.Web.HttpRequestWrapper)((System.Web.Mvc.Controller)filterContext.Controller).Request).RequestType;
// DNS 。
string server = ((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.HttpContext).Request).UserHostAddress;
#region server
/*
* (c)1993 - 2009 (msft . o: )。
*
* Windows TCP / IP。
*
* IP 。
* 。
IP
* 。
* IP
* 。
*
* , ( )
* “*” 。
*
:
*
* 102.54.94.97 rhino.acme.com
* 38.25.63.10 x.acme.com x
* DNS 。
* 127.0.0.1 localhost
*::1 localhost
*/
#endregion
//
//
//
}
}