-
ActionFilterAttribute:
示例:实现一个日志记录过滤器,记录每个控制器动作方法的执行时间和参数信息。public class LogActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { // 记录方法开始执行时间和参数信息 context.HttpContext.Items["StartTime"] = DateTime.Now; LogParameters(context.ActionArguments); } public override void OnActionExecuted(ActionExecutedContext context) { // 记录方法执行结束时间和耗时 var startTime = (DateTime)context.HttpContext.Items["StartTime"]; var duration = DateTime.Now - startTime; LogDuration(duration); } private void LogParameters(IDictionary<string, object> parameters) { // 将参数信息记录到日志中 foreach (var param in parameters) { // 记录参数名称和值 } } private void LogDuration(TimeSpan duration) { // 将方法执行时间记录到日志中 // 例如: "Method executed in {duration.TotalMilliseconds} ms." } }
-
AuthorizeAttribute:
示例:实现一个基于角色的授权过滤器,只允许具有特定角色的用户访问某个控制器动作方法。public class RoleAuthorizeAttribute : AuthorizeAttribute { private readonly string[] _allowedRoles; public RoleAuthorizeAttribute(params string[] allowedRoles) { _allowedRoles = allowedRoles; } protected override bool AuthorizeCore(HttpContextBase httpContext) { // 获取当前用户的角色信息 var user = httpContext.User; if (user.Identity.IsAuthenticated) { // 检查用户是否具有允许的角色 return _allowedRoles.Any(role => user.IsInRole(role)); } return false; } }
-
ExceptionFilterAttribute:
示例:实现一个全局异常处理过滤器,将所有未处理的异常记录到日志中,并返回友好的错误页面。public class GlobalExceptionFilter : ExceptionFilterAttribute { public override void OnException(ExceptionContext context) { // 记录异常信息到日志中 LogException(context.Exception); // 设置响应状态码为500 Internal Server Error context.HttpContext.Response.StatusCode = 500; // 设置视图名称为"Error" context.Result = new ViewResult { ViewName = "Error" }; // 将异常信息传递给视图 ((ViewResult)context.Result).ViewData["Exception"] = context.Exception; // 标记异常已被处理 context.ExceptionHandled = true; } private void LogException(Exception exception) { // 将异常信息记录到日志中 // 例如: logger.LogError(exception, "An unhandled exception occurred."); } }
-
ResultFilterAttribute:
示例:实现一个 JSON 格式化过滤器,将控制器动作方法的返回值自动序列化为 JSON 格式。public class JsonResultFilterAttribute : ResultFilterAttribute { public override void OnResultExecuting(ResultExecutingContext context) { // 检查返回值是否为 JsonResult 类型 if (context.Result is JsonResult jsonResult) { // 将返回值序列化为 JSON 格式 var json = JsonConvert.SerializeObject(jsonResult.Value); // 设置响应内容类型为 application/json context.HttpContext.Response.ContentType = "application/json"; // 将 JSON 字符串写入响应 context.HttpContext.Response.WriteAsync(json); // 标记结果已被处理 context.Cancel = true; } } }
其他过滤器的使用示例可以参考官方文档或其他相关资料。总的来说,这些过滤器可以帮助开发者在 Web 应用程序中实现各种横切关注点,提高代码的可重用性和可维护性。