1.ActionFilterAttribute
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; using System.Web.Mvc; namespace WolfUI.Filter { public class wolfFilterAttribute : ActionFilterAttribute { //action method調用前發生。 public override void OnActionExecuting(ActionExecutingContext filterContext) { Debug.WriteLine("OnActionExecuting"); } //action method調用后發生, 但是在result執行前發生 (在 view 呈現前) public override void OnActionExecuted(ActionExecutedContext filterContext) { Debug.WriteLine("OnActionExecuted"); } //result執行前發生(在view 呈現后) public override void OnResultExecuted(ResultExecutedContext filterContext) { Debug.WriteLine("OnResultExecuted"); } //result執行前發生(在view 呈現前) public override void OnResultExecuting(ResultExecutingContext filterContext) { Debug.WriteLine("OnResultExecuting"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WolfUI.Filter { /// <summary> /// 接口參數驗證過濾器 /// author:wolf /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)] public class ModelValidationAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext actionContext) { var viewData = actionContext.Controller.ViewData; var modelState = viewData.ModelState; if (!modelState.IsValid) { string error = string.Empty; foreach (var key in modelState.Keys) { var state = modelState[key]; if (state.Errors.Any()) { error = state.Errors.First().ErrorMessage; break; } } actionContext.Result = new JavaScriptResult() { Script = $"$tools.dangerTip('{error}','');" }; } } } }
2.HandleErrorAttribute
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace SuiBao.WebBI.Filter { public class ExceptionLogAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { //寫錯誤日志記錄 string url = HttpContext.Current.Request.Url.AbsoluteUri; string message = string.Format("異常頁面:{0}\r\n引發異常源:{1}\r\n消息類型:{2}\r\n消息內容:{3}\r\n引發異常的方法:{4}\r\n堆棧信息:{5}" , url , filterContext.Exception.Source , filterContext.Exception.GetType().Name , filterContext.Exception.Message , filterContext.Exception.TargetSite, filterContext.Exception.StackTrace ); if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { SuiBao.Utility.LogHelper.Exception(message); var reqWith = filterContext.RequestContext.HttpContext.Request.Params["X-Requested-With"]; //還有一種判斷辦法,根據報文頭里的accept類型,參考權限驗證里面 if (!string.IsNullOrEmpty(reqWith) && reqWith == "XMLHttpRequest") { filterContext.Result = new JavaScriptResult() { Script = "$tools.dangerTip( '系統錯誤,請稍候再試!');" }; } else { filterContext.Result = new JsonNetResult() { Data = new { Success = false, Msg = "系統錯誤,請稍候再試!" } }; } } else { SuiBao.Utility.LogHelper.Exception(message); //根據狀態碼處理 int statusCode = new HttpException(null, filterContext.Exception).GetHttpCode(); if (statusCode == 500) { filterContext.Result = new RedirectResult("/Error/Http_500"); filterContext.HttpContext.Response.StatusCode = 500; } else if (statusCode == 404) { filterContext.Result = new RedirectResult("/Error/Http_404"); filterContext.HttpContext.Response.StatusCode = 404; } } filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; } } }
3.AuthorizeAttribute
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WolfUI.Filter { public class AuthorizeDiy : AuthorizeAttribute { /// <summary> /// 提供一個入口用於自定義授權檢查 /// </summary> /// <param name="httpContext"></param> /// <returns></returns> protected override bool AuthorizeCore(HttpContextBase httpContext) { bool pass = false; HttpCookie cookie = HttpContext.Current.Request.Cookies["admin"]; if (cookie == null || cookie.Value == null) { httpContext.Response.StatusCode = 401; pass = false; } else { pass = true; } return pass; } /// <summary> /// 處理未能授權的Http請求 /// </summary> /// <param name="filterContext"></param> protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { base.HandleUnauthorizedRequest(filterContext); filterContext.HttpContext.Response.Write(filterContext.HttpContext.Response.StatusCode); if (filterContext.HttpContext.Response.StatusCode == 401) { //跳轉到登錄界面 filterContext.Result = new RedirectResult("/Login"); } } } }
4.設置全局過濾
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //登錄驗證 filters.Add(new AuthorizationAttribute()); //異常處理 filters.Add(new ExceptionLogAttribute()); } }