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; }
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); }
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); }
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); }
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); }
/// <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); } } }
/// <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)); }
public override string ToString() { return(JsonSerializer.Serialize(this, SystemTextJsonHelper.GetAdncDefaultOptions())); }