MVCカスタムフィルタ(Filter)ルーティング制御、例外処理、認可処理(クライアント情報取得)を実現

6800 ワード

MVCカスタムフィルタ(Filter)は、ルーティング制御、例外処理、認可処理(クライアント情報取得)を実現することができる
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
            //  
            //  
            //  

        }
    }