private async Task HandleExceptionAsync(HttpContext context, Exception exception) { var requestId = System.Diagnostics.Activity.Current?.Id ?? context.TraceIdentifier; var eventId = new EventId(exception.HResult, requestId); _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() ? exception.GetExceptionDetail() : $"系统异常,请联系管理员({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, SystemTextJson.GetAdncDefaultOptions()); await context.Response.WriteAsync(errorText); }
public bool TryEvaluateSelector(ISelectorInfo selectorInfo) { // Note: Operators are processed by ListFormatter return(selectorInfo.CurrentValue switch { JObject _ => NewtonSoftJson.TryEvaluateSelector(selectorInfo), JsonElement _ => SystemTextJson.TryEvaluateSelector(selectorInfo), _ => false });
/// <summary> /// Controllers 注册 /// Sytem.Text.Json 配置 /// FluentValidation 注册 /// ApiBehaviorOptions 配置 /// </summary> protected virtual void AddControllers() { Services .AddControllers(options => options.Filters.Add(typeof(CustomExceptionFilterAttribute))) .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateTimeConverter()); options.JsonSerializerOptions.Converters.Add(new DateTimeNullableConverter()); options.JsonSerializerOptions.Encoder = SystemTextJson.GetAdncDefaultEncoder(); //该值指示是否允许、不允许或跳过注释。 options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; //dynamic与匿名类型序列化设置 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; //dynamic options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; //匿名类型 options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }) .AddFluentValidation(cfg => { //Continue 验证失败,继续验证其他项 ValidatorOptions.Global.DefaultClassLevelCascadeMode = CascadeMode.Continue; //cfg.ValidatorOptions.DefaultClassLevelCascadeMode = FluentValidation.CascadeMode.Continue; // Optionally set validator factory if you have problems with scope resolve inside validators. // cfg.ValidatorFactoryType = typeof(HttpContextServiceProviderValidatorFactory); }); Services .Configure <ApiBehaviorOptions>(options => { //调整参数验证返回信息格式 //关闭自动验证 //options.SuppressModelStateInvalidFilter = true; //格式化验证信息 options.InvalidModelStateResponseFactory = (context) => { var problemDetails = new ProblemDetails { Detail = context.ModelState.GetValidationSummary("<br>"), Title = "参数错误", Status = (int)HttpStatusCode.BadRequest, Type = "https://httpstatuses.com/400", Instance = context.HttpContext.Request.Path }; return(new ObjectResult(problemDetails) { StatusCode = problemDetails.Status }); }; }); //add skyamp //_services.AddSkyApmExtensions().AddCaching(); }
public bool TryEvaluateSelector(ISelectorInfo selectorInfo) { // Note: Operators are processed by ListFormatter switch (selectorInfo.CurrentValue) { case JObject _: return(NewtonSoftJson.TryEvaluateSelector(selectorInfo)); case JsonElement _: return(SystemTextJson.TryEvaluateSelector(selectorInfo)); default: return(false); } }
/// <summary> /// 注册Rest服务(跨微服务之间的同步通讯) /// </summary> /// <typeparam name="TRestClient">Rpc服务接口</typeparam> /// <param name="serviceName">在注册中心注册的服务名称,或者服务的Url</param> /// <param name="policies">Polly策略</param> protected virtual void AddRestClient <TRestClient>(string serviceName, List <IAsyncPolicy <HttpResponseMessage> > policies) where TRestClient : class { var addressNode = RpcAddressInfo.FirstOrDefault(x => x.Service.EqualsIgnoreCase(serviceName)); if (addressNode is null) { throw new NullReferenceException(nameof(addressNode)); } Services.TryAddScoped <CacheDelegatingHandler>(); Services.TryAddScoped <TokenDelegatingHandler>(); Services.TryAddScoped <ConsulDiscoverDelegatingHandler>(); Services.TryAddScoped <TokenFactory>(); var registeredType = Configuration.GetRegisteredType().ToLower(); //注册RefitClient,设置httpclient生命周期时间,默认也是2分钟。 var contentSerializer = new SystemTextJsonContentSerializer(SystemTextJson.GetAdncDefaultOptions()); var refitSettings = new RefitSettings(contentSerializer); var clientbuilder = Services.AddRefitClient <TRestClient>(refitSettings) .SetHandlerLifetime(TimeSpan.FromMinutes(2)) .AddPolicyHandlerICollection(policies) //.UseHttpClientMetrics() .AddHttpMessageHandler <CacheDelegatingHandler>() .AddHttpMessageHandler <TokenDelegatingHandler>(); switch (registeredType) { case RegisteredTypeConsts.Direct: { clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.Direct)); break; } case RegisteredTypeConsts.ClusterIP: { clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.CoreDns)); break; } case RegisteredTypeConsts.Consul: { clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.Consul)) .AddHttpMessageHandler <ConsulDiscoverDelegatingHandler>(); break; } } }
private OperationLog CreateOpsLog(string className, string methodName, string logName, object[] arguments, UserContext userContext) { var log = new OperationLog { ClassName = className, CreateTime = DateTime.Now, LogName = logName, LogType = "操作日志", Message = JsonSerializer.Serialize(arguments, SystemTextJson.GetAdncDefaultOptions()), Method = methodName, Succeed = "false", UserId = userContext.Id, UserName = userContext.Name, Account = userContext.Account, RemoteIpAddress = userContext.RemoteIpAddress }; return(log); }
public override string ToString() => JsonSerializer.Serialize(this, SystemTextJson.GetAdncDefaultOptions());