InterfaceLogFilter.cs 5.2 KB
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Infrastructure;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Net.Http.Headers;
using WebRepository;

namespace WebApp
{
    public class InterfaceLogFilter : ActionFilterAttribute
    {
        private string ActionArguments { get; set; }
        private Stopwatch Stopwatch { get; set; }

        protected readonly IRepository<SysInterfaceLog> _app;

        public InterfaceLogFilter(IRepository<SysInterfaceLog> app, IAuth authUtil)
        {
            _app = app;
            AuthStrategyContext authStrategyContext = authUtil.GetCurrentUser();
            if (authStrategyContext != null)
            {
                _app._loginInfo = new LoginInfo
                {
                    Id = authStrategyContext.User.Id,
                    Account = authStrategyContext.User.Account,
                    Name = authStrategyContext.User.Name,
                };
            }
            else
            {
                _app._loginInfo = new LoginInfo
                {
                    Id = 0,
                    Account = "Guest",
                    Name = "匿名",
                };
            }
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            ActionArguments = Newtonsoft.Json.JsonConvert.SerializeObject(filterContext.ActionArguments);

            Stopwatch = new Stopwatch();
            Stopwatch.Start();
        }

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
            Stopwatch.Stop();

            IHeaderDictionary headersDictionary = context.HttpContext.Request.Headers;
            string Browser = headersDictionary[HeaderNames.UserAgent].ToString();
            string Server = context.HttpContext.Request.Host.ToString();
            string Path = context.HttpContext.Request.Path.ToString();
            string QueryString = context.HttpContext.Request.QueryString.ToString();
            var description = (Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor;
            string ApiGroup = description.ControllerName;
            string ActionName = description.ActionName;
            string Method = context.HttpContext.Request.Method;
            string Name = _app._loginInfo.Name;
            string Ip = context.HttpContext.Connection.RemoteIpAddress.ToString();
            string Request = ActionArguments.Replace("\r", "").Replace("\n", "");
            dynamic dresult = (context.Result == null ? null : (context.Result.GetType().Name == "EmptyResult" ? new { Value = "无返回结果" } : context.Result as dynamic));

            string Response = "在返回结果前发生了异常";
            try
            {
                if (dresult != null)
                {
                    Response = FormatResponse(Newtonsoft.Json.JsonConvert.SerializeObject(dresult.Value));
                }
            }
            catch (Exception)
            {
                Response = "";
            }

            bool bResult = GetResponseResult(Response);
            string Result = "成功";
            int Flag = 1;
            if (!bResult)
            {
                Result = "失败";
                Flag = GetReSendFlag(ActionName);
            }

            _app.Add(new SysInterfaceLog()
            {
                Type = "接收",
                System = "WMS",
                Method = Method,
                Server = Server,
                Path = Path,
                ActionName = ActionName,
                QueryString = QueryString,
                ApiGroup = ApiGroup,
                Request = Request,
                Response = Response,
                TotalMilliseconds = Stopwatch.Elapsed.TotalMilliseconds,
                LogTime = DateTime.Now,
                Name = Name,
                Ip = Ip,
                Browser = Browser,
                Result = Result,
                Flag = Flag,
            }); ;
        }

        private bool GetResponseResult(string response)
        {
            try
            {
                Response Res = JsonHelper.Instance.Deserialize<Response>(response);
                if (Res.Code != 200)
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

        private int GetReSendFlag(string actionName)
        {
            List<string> actionNames = new List<string>();
            actionNames.Add("SetStackerStatus".ToLower());
            if (actionNames.Contains(actionName.ToLower()))
            {
                return 0;
            }
            return 1;
        }

        private string FormatResponse(string response)
        {
            response = response.Replace("\r", "").Replace("\n", "");
            response = response.Replace("\"\\\"{", "{").Replace("}\\\"\"", "}").Replace("\\\\\\", "");
            response = response.Replace("\"{", "{").Replace("}\"", "}").Replace("\\\"", "\"");

            return response;
        }
    }
}