खोज…


एक लॉगिंग एक्शन फ़िल्टर

 public class LogActionFilter : ActionFilterAttribute
 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           Log("OnActionExecuting", filterContext.RouteData);       
      }

      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
           Log("OnActionExecuted", filterContext.RouteData);       
      }

      public override void OnResultExecuting(ResultExecutingContext filterContext)
      {
           Log("OnResultExecuting", filterContext.RouteData);       
      }

      public override void OnResultExecuted(ResultExecutedContext filterContext)
      {
           Log("OnResultExecuted", filterContext.RouteData);       
      }


      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");
      }
 }

सत्र नियंत्रण कार्रवाई फ़िल्टर - पृष्ठ और AJAX अनुरोध

आमतौर पर ऑथेंटिकेशन और ऑथराइजेशन प्रोसेस बिल्ट-इन कुकी और टोकन द्वारा समर्थित होते हैं .net MVC में होते हैं। लेकिन यदि आप इसे अपने आप को Session साथ करने का निर्णय लेते हैं, तो आप पेज अनुरोध और अजाक्स अनुरोध दोनों के लिए तर्क का उपयोग कर सकते हैं।

public class SessionControl : ActionFilterAttribute
{
    public override void OnActionExecuting ( ActionExecutingContext filterContext )
    {
        var session = filterContext.HttpContext.Session;

        /// user is logged in (the "loggedIn" should be set in Login action upon a successful login request)
        if ( session["loggedIn"] != null && (bool)session["loggedIn"] )
            return;

        /// if the request is ajax then we return a json object
        if ( filterContext.HttpContext.Request.IsAjaxRequest() )
        {
            filterContext.Result = new JsonResult
            {
                Data = "UnauthorizedAccess",
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
        /// otherwise we redirect the user to the login page
        else
        {
            var redirectTarget = new RouteValueDictionary { { "Controller", "Login" }, { "Action", "Index" } };
            filterContext.Result = new RedirectToRouteResult(redirectTarget);
        }
    }

    public override void OnResultExecuting ( ResultExecutingContext filterContext )
    {
        base.OnResultExecuting(filterContext);
        
        /// we set a field 'IsAjaxRequest' in ViewBag according to the actual request type
        filterContext.Controller.ViewBag.IsAjaxRequest = filterContext.HttpContext.Request.IsAjaxRequest();
    }
}

क्रिया फ़िल्टर उपयोग स्थान (वैश्विक, नियंत्रक, क्रिया)

आप तीन संभावित स्तरों पर एक्शन फिल्टर लगा सकते हैं:

  1. वैश्विक
  2. नियंत्रक
  3. कार्य

विश्व स्तर पर एक फिल्टर रखने का मतलब है कि यह किसी भी मार्ग के लिए अनुरोध पर अमल करेगा। नियंत्रक पर एक रखने से यह उस नियंत्रक में किसी भी कार्रवाई के अनुरोध पर निष्पादित होता है। किसी एक को एक्शन पर रखने का मतलब है कि वह एक्शन के साथ चलता है।

यदि हमारे पास यह सरल क्रिया फ़िल्टर है:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class CustomActionFilterAttribute : FilterAttribute, IActionFilter
{
    private readonly string _location;

    public CustomActionFilterAttribute(string location)
    {
        _location = location;
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Trace.TraceInformation("OnActionExecuting: " + _location);
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Trace.TraceInformation("OnActionExecuted: " + _location);
    }
}

हम इसे वैश्विक स्तर पर फ़िल्टर फ़िल्टर संग्रह में जोड़ सकते हैं। विशिष्ट ASP.NET MVC प्रोजेक्ट सेटअप के साथ, यह App_Start / FilterConfig.cs में किया जाता है।

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomActionFilterAttribute("Global"));
    }
}

हम इसे कंट्रोलर और एक्शन लेवल पर भी जोड़ सकते हैं, जैसे कंट्रोलर में:

[CustomActionFilter("HomeController")]
public class HomeController : Controller
{
    [CustomActionFilter("Index")]
    public ActionResult Index()
    {
        return View();
    }
}

यदि हम एप्लिकेशन चलाते हैं और आउटपुट विंडो को देखते हैं, तो हम निम्नलिखित संदेश देखेंगे:

iisexpress.exe Information: 0 : OnActionExecuting: Global
iisexpress.exe Information: 0 : OnActionExecuting: HomeController
iisexpress.exe Information: 0 : OnActionExecuting: Index
iisexpress.exe Information: 0 : OnActionExecuted: Index
iisexpress.exe Information: 0 : OnActionExecuted: HomeController
iisexpress.exe Information: 0 : OnActionExecuted: Global

जैसा कि आप देख सकते हैं, जब अनुरोध आता है, तो फ़िल्टर निष्पादित हो जाते हैं:

  1. वैश्विक
  2. नियंत्रक
  3. कार्य

वैश्विक स्तर पर रखे गए फिल्टर के उत्कृष्ट उदाहरणों में शामिल हैं:

  1. प्रमाणीकरण फ़िल्टर
  2. प्राधिकरण फ़िल्टर करता है
  3. लॉगिंग फिल्टर

अपवाद हैंडलर विशेषता

यह विशेषता कोड में सभी अखंडित अपवादों को संभालती है, (यह ज्यादातर अजाक्स अनुरोधों के लिए है - जो JSON के साथ सौदा करती है - लेकिन इसे जारी रखा जा सकता है)

public class ExceptionHandlerAttribute : HandleErrorAttribute
{
    /// <summary>
    ///   Overriden method to handle exception
    /// </summary>
    /// <param name="filterContext"> </param>
    public override void OnException(ExceptionContext filterContext)
    {
        // If exeption is handled - return ( don't do anything)
        if (filterContext.ExceptionHandled)
            return;

        // Set the ExceptionHandled to true ( as you are handling it here)
        filterContext.ExceptionHandled = true;

        //TODO: You can Log exception to database or Log File

        //Set your result structure 
        filterContext.Result = new JsonResult
        {
            Data = new { Success = false, Message = filterContext .Exception.Message, data = new {} },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };

    }
}

तो मान लें कि आपको हमेशा इसी तरह की JSON प्रतिक्रिया भेजनी होगी:

{ 

    Success: true,  // False when Error
    
    data: {},
    
    Message:"Success" // Error Message when Error

}

इसलिए नियंत्रक क्रियाओं में अपवादों को संभालने के बजाय, इस तरह:

public ActionResult PerformMyAction()
{
    try
    {
        var myData = new { myValue = 1};
        
        throw new Exception("Handled", new Exception("This is an Handled Exception"));
        
        return Json(new {Success = true, data = myData, Message = ""});
    
    }
    catch(Exception ex)
    {
        return Json(new {Success = false, data = null, Message = ex.Message});
    }
}

तुम यह केर सकते हो:

[ExceptionHandler]
public ActionResult PerformMyAction()
{
        var myData = new { myValue = 1};
        
        throw new Exception("Unhandled", new Exception("This is an unhandled Exception"));
        
        return Json(new {Success = true, data = myData, Message = ""});
}

या आप नियंत्रक स्तर पर जोड़ सकते हैं

[ExceptionHandler]
public class MyTestController : Controller
{
    
    public ActionResult PerformMyAction()
    {
            var myData = new { myValue = 1};
            
            throw new Exception("Unhandled", new Exception("This is an unhandled Exception"));
            
            return Json(new {Success = true, data = myData, Message = ""});
    }
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow