.Net Core 过滤器记录全局日志/出参入参

过滤器

  • IActionFilter
  • IAuthorizationFilter
  • IExceptionFilter
  • IResourceFilter
  • IResultFilter

ActionFilter过滤器

public class ActionFilter : IActionFilter
    {
        private readonly ILogger<ActionFilter> _logger;
        public ActionFilter(ILogger<ActionFilter> logger)
        {
            _logger = logger;
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {

        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            //校验参数
            if (!context.ModelState.IsValid)
            {
                context.Result = new ContentResult()
                {
                    Content = context.ModelState.Values.SelectMany(e => e.Errors).Select(e => e.ErrorMessage).FirstOrDefault(),
                    StatusCode = 500,
                    ContentType = "application/json"
                };
            }

            context.HttpContext.Request.ContentType = "application/json";

            var PortName = context.HttpContext.Request.Path;//获得调用接口,
            var RequestType = context.HttpContext.Request.Method;
            //var StatusCode = Convert.ToInt32(new HttpResponseMessage(HttpStatusCode.OK).StatusCode);//设置状态码
            //var ParameterList = context.ActionArguments.FirstOrDefault().Value.ToJson();//获得参数值

            //参数读取
            if (RequestType == "POST" || RequestType == "PUT" || RequestType == "DELETE")
            {
                var httpContext = context.HttpContext;
                var request = httpContext.Request;
                request.Body.Position = 0;
                StreamReader sr = new StreamReader(request.Body);
                string body = sr.ReadToEndAsync().Result;
                _logger.LogInformation("\r\n请求日志: "+PortName.Value+"\r\n" + body);
                //具体业务,  如果要不进入Action给ActionExecutingContext 对象的Result复制.
                context.Result = new ContentResult()
            	{
                	Content = "成功了. ",
                	StatusCode = 200,
                	ContentType = "application/json"
           	 	};
            }
            else if (RequestType == "GET")
            {
                var Param= context.HttpContext.Request.Query["Param"];
            }
            else
            {
                ReturnFun(context, "无效请求!");
            }
        }
    }

Exception异常过滤器

public class ExceptionFilter : IExceptionFilter
    {

        readonly ILogger<ExceptionFilter> _logger;
        public ExceptionFilter(ILogger<ExceptionFilter> logger)
        {
            _logger = logger;
        }

        public void OnException(ExceptionContext context)
        {
            _logger.LogError("\r\n错误信息: "+context.Exception.Message);

            //处理各种异常
            var  response = new {
                Message = "系统错误",
                Result = null,
                Status = 0
            };
            
            context.ExceptionHandled = false;
            context.Result = new JsonResult(response);
        }
    }

使用方式

全局注册方式,也可以在具体的Action上加特性使用

services.AddMvc(o =>
{
       o.Filters.Add(typeof(ExceptionFilter));
       o.Filters.Add(typeof(ActionFilter));
});

链接: 使用中间件记录日志.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值