赞
踩
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 应用程序中实现各种横切关注点,提高代码的可重用性和可维护性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。