zoukankan      html  css  js  c++  java
  • 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 }
                );
            }
        }
    
  • 相关阅读:
    Struts2之Action基础与配置
    关于Struts2的类型转换详解
    Struts2自定义类型转换器
    MyEclipse 快捷键
    Struts2中的ActionContext
    struts2中的action访问web对象
    5.9每日一题题解
    5.8 每日一题题解
    5.7 每日一题题解
    5.6 每日一题题解
  • 原文地址:https://www.cnblogs.com/lizhenhong/p/9591470.html
Copyright © 2011-2022 走看看