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);
    }
示例#2
0
 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);
            }
        }
示例#5
0
    /// <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;
        }
        }
    }
示例#6
0
    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);
    }
示例#7
0
 public override string ToString() => JsonSerializer.Serialize(this, SystemTextJson.GetAdncDefaultOptions());