asp.net core配置验证

在开发asp.net core时,通常会在appsettings.json中配置信息,这些信息都是以一个json的格式存储,在程序中通过Options的方式来绑定实体类使用,如下面的APIConfig和实体类。

配置文件:


{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  
  "APIConfig": {
    "TimeOut": 2000,
    "Category": "Small",
    "Max": 1.5
  }
}

APIConfig实体类:​​​​​​​

public class APIConfig
{
    public int TimeOut { get; set; }
    public string? Category { get; set; }
    public double Max { get; set; }
}
public enum Category
{
    None,
    Large,
    Small,
    Middle
}

配置裸奔是有相当风险的,每个配置项都应该特定的含义和范围,当不合规配置随着系统启动,悄悄地进入服务状态时,就相当埋了一颗雷,肯定有人会在某时间踩上,爆掉,形成一次生产事帮。为了把这个风险消除掉,那就要给这些配置设置个围栏——即验证。

可以在服务启动时,添加Valdate来验证配置文件。首先用Bind方式取出要验证的配置实体,再次就是用Validate方法逐个验证为了把问题尽早暴露,当然,怎么验证,验证那些属性,自行决定。​​​​​​​

using Microsoft.Extensions.Options;
using System.ComponentModel.DataAnnotations;

var builder = WebApplication.CreateBuilder(args);
builder.Services
    .AddOptions<APIConfig>()
    .Bind(builder.Configuration.GetSection(nameof(APIConfig)))
    .Validate(c =>
    {
        return c.TimeOut > 0 && c.TimeOut <= 1000 && c.Max >= -1.5 && c.Max <= 1.5 && Enum.TryParse<Category>(c.Category, true, out Category o);
    },"APIConfig配置有误!")
    .ValidateOnStart();
var app = builder.Build();
app.MapGet("/apiconfig", (IOptions<APIConfig> options) =>
{
    return options.Value;
});
app.Run();

其实验证在.net很普及,使用的是DataAnnotations,当然,这里也不例外,可以在实体类上添加具体的验证规则,这里就不展开了。代码如下:​​​​​​​


using Microsoft.Extensions.Options;
using System.ComponentModel.DataAnnotations;

var builder = WebApplication.CreateBuilder(args);
builder.Services
    .AddOptions<APIConfig>()
    .Bind(builder.Configuration.GetSection(nameof(APIConfig)))
    .ValidateDataAnnotations()
    .ValidateOnStart();
var app = builder.Build();
app.MapGet("/apiconfig", (IOptions<APIConfig> options) =>
{
    return options.Value;
});
app.Run();

public class APIConfig
{
    [Range(0,1000)]
    public int TimeOut { get; set; }
    [EnumDataType(typeof(Category))]
    public string? Category { get; set; }
    [Range(-1.5, 1.5)]
    public double Max { get; set; }
}

public enum Category
{
    None,
    Large,
    Small,
    Middle
}

保障生产安全,再多一点努力也是值的。不放过每个小细节,让你的服务在成长。

原文地址 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值