コード例 #1
0
        public override void OnException(ExceptionContext context)
        {
            Exception  exception = context.Exception;
            JsonResult result    = null;

            if (exception is BusinessException)
            {
                result = new JsonResult(
                    JsonSerializer.Deserialize <ErrorModel>(exception.Message, SystemTextJsonHelper.GetAdncDefaultOptions())
                    , SystemTextJsonHelper.GetAdncDefaultOptions())
                {
                    StatusCode = exception.HResult
                };
            }
            else
            {
                result = new JsonResult(new ErrorModel(System.Net.HttpStatusCode.InternalServerError, "服务器异常")
                                        , SystemTextJsonHelper.GetAdncDefaultOptions());

                var userContext = context.HttpContext.RequestServices.GetService <UserContext>();

                var    descriptor = context.ActionDescriptor as ControllerActionDescriptor;
                string className  = descriptor.ControllerName;
                string method     = descriptor.ActionName;
                string requestUrl = context.HttpContext.Request.Path;
                long   userId     = userContext.ID;
                //var parms = ex.Data?.ToDictionary().Select(k => k.Key + "=" + k.Value).Join() ?? "";

                _logger.LogError(exception, exception.Message);
                //Agent.Tracer.CurrentTransaction.CaptureException(exception);
            }

            context.Result           = result;
            context.ExceptionHandled = true;
        }
コード例 #2
0
        private async Task HandleExceptionAsync(HttpContext context, Exception exception)
        {
            var eventId = new EventId(exception.HResult);

            _logger.LogError(eventId, exception, exception.Message);

            var status = 500;
            var type   = string.Concat("https://httpstatuses.com/", status);
            var title  = _env.IsDevelopment() ? exception.Message : $"系统异常";
            var detial = _env.IsDevelopment() ? ExceptionHelper.GetExceptionDetail(exception) : $"系统异常,请联系管理员({eventId})";

            var problemDetails = new ProblemDetails
            {
                Title = title
                ,
                Detail = detial
                ,
                Type = type
                ,
                Status = status
            };

            context.Response.StatusCode  = status;
            context.Response.ContentType = "application/problem+json";
            var errorText = JsonSerializer.Serialize(problemDetails, SystemTextJsonHelper.GetAdncDefaultOptions());
            await context.Response.WriteAsync(errorText);
        }
コード例 #3
0
        private dynamic CreateOpsLog(string className, string methodName, string logName, object[] arguments, UserContext userContext)
        {
            dynamic log = new ExpandoObject();

            log.ClassName       = className;
            log.CreateTime      = DateTime.Now;
            log.LogName         = logName;
            log.LogType         = "操作日志";
            log.Message         = JsonSerializer.Serialize(arguments, SystemTextJsonHelper.GetAdncDefaultOptions());
            log.Method          = methodName;
            log.Succeed         = "false";
            log.UserId          = userContext.Id;
            log.UserName        = userContext.Name;
            log.Account         = userContext.Account;
            log.RemoteIpAddress = userContext.RemoteIpAddress;
            return(log);
        }
コード例 #4
0
        private OperationLog CreateOpsLog(string className, string methodName, string logName, object[] arguments, IUserContext userContext)
        {
            var log = new OperationLog
            {
                ClassName       = className,
                CreateTime      = DateTime.Now,
                LogName         = logName,
                LogType         = "操作日志",
                Message         = JsonSerializer.Serialize(arguments, SystemTextJsonHelper.GetAdncDefaultOptions()),
                Method          = methodName,
                Succeed         = "false",
                UserId          = userContext.Id,
                UserName        = userContext.Name,
                Account         = userContext.Account,
                RemoteIpAddress = userContext.RemoteIpAddress
            };

            return(log);
        }
コード例 #5
0
        public void Intercept(IInvocation invocation)
        {
            invocation.Proceed();

            var serviceMethod = invocation.Method ?? invocation.MethodInvocationTarget;
            var attribute     = serviceMethod.GetCustomAttribute <OpsLogAttribute>();

            if (attribute == null)
            {
                return;
            }

            if (_isLoging)
            {
                return;
            }
            else
            {
                _isLoging = true;
            }

            var logInfo = new
            {
                ClassName       = serviceMethod.DeclaringType.FullName,
                CreateTime      = DateTime.Now,
                LogName         = attribute.LogName,
                LogType         = "操作日志",
                Message         = JsonSerializer.Serialize(invocation.Arguments, SystemTextJsonHelper.GetAdncDefaultOptions()),
                Method          = serviceMethod.Name,
                Succeed         = "",
                UserId          = _userContext.ID,
                UserName        = _userContext.Name,
                Account         = _userContext.Account,
                RemoteIpAddress = _userContext.RemoteIpAddress
            };


            var properties = _mqProducer.CreateBasicProperties();

            //设置消息持久化
            properties.Persistent = true;
            _mqProducer.BasicPublish(BaseMqExchanges.Logs, BaseMqRoutingKeys.OpsLog, logInfo, properties);
        }
コード例 #6
0
        /// <summary>
        /// 注册Rpc服务(跨服务之间的同步通讯)
        /// </summary>
        /// <typeparam name="TRpcService">Rpc服务接口</typeparam>
        /// <param name="serviceName">在注册中心注册的服务名称,或者服务的Url</param>
        /// <param name="policies">Polly策略</param>
        /// <param name="token">Token,可空</param>
        protected virtual void AddRpcService <TRpcService>(string serviceName
                                                           , List <IAsyncPolicy <HttpResponseMessage> > policies
                                                           , Func <Task <string> > token = null
                                                           ) where TRpcService : class, IRpcService
        {
            var  prefix          = serviceName.Substring(0, 7);
            bool isConsulAdderss = (prefix == "http://" || prefix == "https:/") ? false : true;

            var refitSettings = new RefitSettings(new SystemTextJsonContentSerializer(SystemTextJsonHelper.GetAdncDefaultOptions()));
            //注册RefitClient,设置httpclient生命周期时间,默认也是2分钟。
            var clientbuilder = _services.AddRefitClient <TRpcService>(refitSettings)
                                .SetHandlerLifetime(TimeSpan.FromMinutes(2));

            //从consul获取地址
            if (isConsulAdderss)
            {
                clientbuilder.ConfigureHttpClient(c => c.BaseAddress = new Uri($"http://{serviceName}"))
                .AddHttpMessageHandler(() =>
                {
                    return(new ConsulDiscoveryDelegatingHandler(_consulConfig.ConsulUrl, token));
                });
            }
            else
            {
                clientbuilder.ConfigureHttpClient((options) =>
                {
                    options.BaseAddress = new Uri(serviceName);
                });
            }

            //添加polly相关策略
            if (policies != null && policies.Any())
            {
                foreach (var policy in policies)
                {
                    clientbuilder.AddPolicyHandler(policy);
                }
            }
        }
コード例 #7
0
        /// <summary>
        /// 注册Rpc服务(跨微服务之间的同步通讯)
        /// </summary>
        /// <typeparam name="TRpcService">Rpc服务接口</typeparam>
        /// <param name="serviceName">在注册中心注册的服务名称,或者服务的Url</param>
        /// <param name="policies">Polly策略</param>
        public virtual void AddRpcService <TRpcService>(string serviceName
                                                        , List <IAsyncPolicy <HttpResponseMessage> > policies
                                                        ) where TRpcService : class, IRpcService
        {
            var  prefix          = serviceName.Substring(0, 7);
            bool isConsulAdderss = (prefix == "http://" || prefix == "https:/") ? false : true;

            var refitSettings = new RefitSettings(new SystemTextJsonContentSerializer(SystemTextJsonHelper.GetAdncDefaultOptions()));
            //注册RefitClient,设置httpclient生命周期时间,默认也是2分钟。
            var clientbuilder = _services.AddRefitClient <TRpcService>(refitSettings)
                                .SetHandlerLifetime(TimeSpan.FromMinutes(2));

            //如果参数是服务名字,那么需要从consul获取地址
            if (isConsulAdderss)
            {
                clientbuilder.ConfigureHttpClient(client => client.BaseAddress = new Uri($"http://{serviceName}"))
                .AddHttpMessageHandler <ConsulDiscoverDelegatingHandler>();
            }
            else
            {
                clientbuilder.ConfigureHttpClient(client => client.BaseAddress = new Uri(serviceName))
                .AddHttpMessageHandler <SimpleDiscoveryDelegatingHandler>();
            }

            //添加polly相关策略
            policies?.ForEach(policy => clientbuilder.AddPolicyHandler(policy));
        }
コード例 #8
0
 public override string ToString()
 {
     return(JsonSerializer.Serialize(this, SystemTextJsonHelper.GetAdncDefaultOptions()));
 }