日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET6之MiniAPI(五):选项

發(fā)布時間:2023/12/4 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET6之MiniAPI(五):选项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

選項是配置一個升級版,一般情況下是把一個范圍內(nèi)的配置包裝成類型,以供使用,比如下面的RedisSetting,是Redis的配置參數(shù):

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts":?"*",?"RedisSetting": {"Host": "127.0.0.1","Port": 6379,"Password": "123","ConnectionTimeOut": "10ms"} }

可以采用下面的形式把配置類型?實體注入到容器(因為沒有說注入這個知識點,這里可以理解為初始化)中。

var?builder?=?WebApplication.CreateBuilder(); builder.Services.Configure<RedisSetting>(builder.Configuration.GetSection("RedisSetting")); var?app?=?builder.Build();

選項分為三種:普通選項目IOptions,熱更新選項IOptionsSnapshot,監(jiān)控選項IOptionsMonitor,下面分別說明。

IOptions選項

app.MapGet("/appinfo", (IOptions<RedisSetting> options) => {return options.Value; });

Demo結(jié)果

熱加載選項:IOptionsSnapshot

app.MapGet("/snapshot", (IOptionsSnapshot<RedisSetting> options) => {return options.Value; });

結(jié)果

更新配置ConnectionTimeOut為15ms,在不重啟服務(wù)的情況下,再次請求,結(jié)果會變成15ms

監(jiān)控選項:IOptionsMonitor

app.MapGet("/monitorstart", (IOptionsMonitor<RedisSetting> options) => {options.OnChange(redisSetting =>{app.Logger.LogInformation(options.CurrentValue.ToString()); });return "Ok"; });

調(diào)用監(jiān)控

當(dāng)把ConnectionTimeOut更新成20ms時,OnChange會被觸發(fā),日志會打印出來

利用監(jiān)控特性可以與報警聯(lián)合起來,當(dāng)監(jiān)控到配置有變化時,通知服務(wù)相關(guān)人知曉,是人為設(shè)置,還是被篡改,以便采取措施。

選項命名:

當(dāng)相同的配置有兩組時,選項命名就非常有用了,比如一主一備

"RedisSettings": {"Main": {"Host": "127.0.0.1","Port": 6379,"Password": "123","ConnectionTimeOut": "10ms"},"Prepare": {"Host": "127.0.0.1","Port": 6380,"Password": "456","ConnectionTimeOut": "12ms"}}

實體類可以用靜態(tài)常量區(qū)分開來

public record RedisSetting {public const string Main = "Main";public const string Prepare = "Prepare";public string? Host { get; set; }public int Port { get; set; }public string? Password { get; set; }public string? ConnectionTimeOut { get; set; } }

分別注入配置即可

builder.Services.Configure<RedisSetting>(RedisSetting.Main,builder.Configuration.GetSection("RedisSettings:Main")); builder.Services.Configure<RedisSetting>(RedisSetting.Prepare,builder.Configuration.GetSection("RedisSettings:Prepare"));

不過只有IOptionsSnapshot和IOptionsMonitor能通過Get方法來獲取命名的配置,IOptions沒有實現(xiàn)Get方法

app.MapGet("/snapshotredissetting", (IOptionsSnapshot<RedisSetting> options) => {return options.Get(RedisSetting.Main); }); app.MapGet("/monitorstart", (IOptionsMonitor<RedisSetting> options) => {options.OnChange(redisSetting =>{app.Logger.LogInformation(options.Get(RedisSetting.Main).ToString());app.Logger.LogInformation(options.Get(RedisSetting.Prepare).ToString());});return options.CurrentValue; });

另外,為了提高配置數(shù)據(jù)的安全性,可以給配置選項增加驗證,可以通過在配置實體類上增加DataAnnotations來驗證,也可以自定義驗證

public record RedisSetting {public string? Host { get; set; }public int Port { get; set; }public string? Password { get; set; }[RegularExpression(@"^\d+ms$", ErrorMessage = "格式不正確,必須是ms")]public string? ConnectionTimeOut { get; set; } }

上面的ConnectionTimeOut是DataAnnotations方式,下面是自定義驗證模式。

builder.Services.AddOptions<RedisSetting>().Bind(builder.Configuration.GetSection("RedisSetting")).ValidateDataAnnotations().Validate(config =>{if (config.Port < 1000){return false;}return true;}, "端口不能少于1000");

如果驗證更復(fù)雜,可以自定義類實現(xiàn),如下:

public class RedisSettingValidation : IValidateOptions<RedisSetting> {public RedisSetting _config { get; init; }public RedisSettingValidation(IConfiguration config){_config = config.GetSection("RedisSetting").Get<RedisSetting>();}public ValidateOptionsResult Validate(string name, RedisSetting options){string? vor=null;var rx = new Regex(@"^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$");if (options != null&&options.Host!=null){var match = rx.Match(options.Host);if (string.IsNullOrEmpty(match.Value)){vor = $"{options.Host} 格式不正確";}if (vor != null){return ValidateOptionsResult.Fail(vor);}}return ValidateOptionsResult.Success;} }

添加驗證類型

builder.Services.Configure<RedisSetting>(builder.Configuration.GetSection("RedisSetting")); builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IValidateOptions<RedisSetting>, RedisSettingValidation>());

總結(jié)

以上是生活随笔為你收集整理的.NET6之MiniAPI(五):选项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级特黄妇女高潮2 | 日日操天天操夜夜操 | 人妻一区二区三区在线 | 夜夜撸 | 久久久久久蜜桃一区二区 | 天天干,天天操,天天射 | jizz性欧美17| 少妇肥臀大白屁股高清 | 亚洲午夜av久久乱码 | 在线观看国产三级 | 欧美贵妇videos办公室 | 三级黄色生活片 | 美女在线播放 | 精品国产一区一区二区三亚瑟 | 苍井空浴缸大战猛男120分钟 | 亚洲av无码精品色午夜果冻不卡 | 日韩午夜一区 | 久色影视| 精品国产一区二区三区久久久蜜月 | 欧洲性猛交 | 久草视频资源 | 娇妻被老王脔到高潮失禁视频 | 成人综合一区 | 日本性高潮视频 | www.99在线| 欧美成人高清 | 亚洲av无码乱码在线观看性色 | 国产一区不卡 | 国产1区在线 | 五月天婷婷色 | 女人囗交吞精囗述 | 温柔少妇的高潮呻吟 | av片大全| 都市乱淫 | 国产高清自拍视频 | 国内少妇毛片视频 | 天干夜夜爽爽日日日日 | 伦伦影院午夜理伦片 | 中文在线a√在线8 | 在线91观看| 日韩欧美在线视频免费观看 | 澳门久久久 | 性生活毛片| 另类小说一区二区 | 国产精品毛片在线 | 国产大尺度视频 | 欧美成人黑人xx视频免费观看 | 国产精品二区一区 | 香蕉视频黄色在线观看 | japanesehdxxxx| 91亚洲视频在线观看 | 国产一区二区内射 | 久久久久久9 | 少妇激情视频 | 一本久道在线 | 日韩在线欧美 | 国产大奶在线观看 | 日韩高清在线一区 | 精品国产影院 | 亚洲精品国产视频 | 爱蜜臀av| 欧美日韩国产一级 | 日韩精品视频免费看 | 不卡的日韩av | 欧美一区三区二区在线观看 | 国产精品无码99re | 国产毛片不卡 | 精品蜜桃av | 91精品国产色综合久久不卡粉嫩 | 视频在线一区二区三区 | 国产色综合天天综合网 | 国产寡妇色xxⅹ交肉视频 | 欧美视频成人 | 极品91尤物被啪到呻吟喷水 | 四虎国产成人永久精品免费 | a一级免费视频 | 国产免费黄 | 黄色国产视频网站 | 日本午夜小视频 | 狼人伊人干| 丁香色综合 | 91爱啪 | 一本久久a精品一合区久久久 | 国产免费又爽又色又粗视频 | 亚洲成人7777 | 麻豆激情网 | www成人啪啪18软件 | 人人干干人人 | 国产夜夜夜 | 手机看片日韩在线 | 亚洲精品男女 | 欧美成人怡红院 | 男插女动态图 | 日韩1页 | 久久精品夜| 岛国精品一区二区 | 在线观看中文字幕码 | 欧日韩视频 | 欧美日韩中文国产一区发布 |