ActionFilterAttribute 全局记录API日志

1、API项目下创建MonitorApiAttribute

public class MonitorApiAttribute : ActionFilterAttribute
    {
        private static readonly string key = "enterTime";

        public override void OnActionExecuted(HttpActionExecutedContext filterContext)
        {
            try
            {
                object beginTime = null;
                if (filterContext.Request.Properties.TryGetValue(key, out beginTime))
                {
                    var user = HttpContext.Current.User as UserInfo;//登录时储存的User
                    var indentify = user != null ? user.Id.ToString() : null;
                   
                    MonitorApiHelper.Monitor(beginTime, filterContext.Request, filterContext.Response, indentify);
                }
            }
            catch (Exception)
            {
            }

            base.OnActionExecuted(filterContext);
        }

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            actionContext.Request.Properties[key] = DateTime.Now.ToBinary();

            base.OnActionExecuting(actionContext);
        }
    }

 

2、Common项目下创建MonitorApiHelper帮助类

public class MonitorApiHelper
    {
       

        public static async void Monitor(object beginTime, HttpRequestMessage httpRequestMessage, HttpResponseMessage httpResponseMessage, string indentify = "", string moduleId = "")
        {
            DateTime time = DateTime.FromBinary(Convert.ToInt64(beginTime));
            var responseTime = Convert.ToInt32((DateTime.Now - time).TotalMilliseconds);

            var appId = "myapp";
            var clientType = 0;
            var responseStatus = 0;

            var request = HttpContext.Current.Request;
            var browerVersion = request.UserAgent;
            var clientIP = request.UserHostAddress;
            var serviceName = request.Url.AbsoluteUri;
            var requestType = MethodConver(request.HttpMethod);

            var inputParams = ReadStream(await httpRequestMessage.Content.ReadAsStreamAsync());
            var outputParams = ReadStream(await httpResponseMessage.Content.ReadAsStreamAsync());

            //在这里使用以上变量记录日志操作
        }

        private static int MethodConver(string method)
        {
            switch (method.ToUpper())
            {
                case "GET":
                    return 0;
                case "POST":
                    return 1;
                case "PUT":
                    return 2;
                case "DELETE":
                    return 3;
                default:
                    break;
            }
            return 0;
        }

        public static string ReadStream(Stream stream)
        {
            var content = string.Empty;
            if (stream != null)
            {
                stream.Seek(0, SeekOrigin.Begin);
                int len = (int)stream.Length;
                byte[] inputByts = new byte[len];
                stream.Read(inputByts, 0, len);
                stream.Position = 0;
                content = Encoding.UTF8.GetString(inputByts);
            }

            return content;
        }
    }

 

3、WebApiConfig下增加代码  config.Filters.Add(new MonitorApiAttribute());

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Filters.Add(new MonitorApiAttribute());

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

 

posted on 2018-09-05 12:34  走出高度  阅读(774)  评论(0)    收藏  举报