using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace DockerStudyApi.Controllers { /// /// 配置测试控制器 /// [Route("api/[controller]/[action]")] [ApiController] public class DemoController : ControllerBase { private readonly ILogger _logger; private readonly IOptions _tespOption; private readonly IOptionsMonitor _monitorTestOption; private readonly IOptionsMonitorCache _monitorCacheTestOption; private readonly IOptionsSnapshot _snapshotTestOption; private readonly IConfiguration _configuration; public DemoController ( ILogger logger, IOptions tespOption, IOptionsMonitor monitorTestOption, IOptionsMonitorCache monitorCacheTestOption, IOptionsSnapshot snapshotTestOption, IConfiguration configuration ) { _logger = logger; _tespOption = tespOption; _monitorTestOption = monitorTestOption; _monitorCacheTestOption = monitorCacheTestOption; _snapshotTestOption = snapshotTestOption; _configuration = configuration; } /// /// 服务测试 /// [HttpGet] public IActionResult Ping() { return Ok(); } /// /// 获取运行时信息 /// [HttpGet] public IActionResult RunTime() { var runInfo = new Dictionary() { {"操作系统",RuntimeInformation.OSDescription }, {".Net版本",RuntimeInformation.FrameworkDescription }, {"运行平台",RuntimeInformation.RuntimeIdentifier }, {"平台架构",RuntimeInformation.OSArchitecture.ToString() }, {"进程架构",RuntimeInformation.ProcessArchitecture.ToString() }, }; return Ok(runInfo); } /// /// 说明:泛型左右尖括号,不能写在注释里,会生成无效的xml /// 解决:用[]或{}或中文符号<> 代替,或者使用xml转义字符 <> /// 获取 IOptions<TestOption> /// [HttpGet] public TestOption TestOption() { return _tespOption.Value; } /// /// 获取 IOptionsMonitor<TestOptionT> /// [HttpGet] public TestOption MonitorTestOption() { _monitorTestOption.OnChange(_ => _logger.LogWarning(_monitorTestOption.CurrentValue.AppId)); return _monitorTestOption.CurrentValue; } /// /// 获取 IOptionsMonitorCache<TestOption> /// [HttpGet] public TestOption MonitorCacheTestOption() { return _monitorCacheTestOption.GetOrAdd("demo",()=> new TestOption()); } /// /// 获取 IOptionsSnapshot<TestOption> /// [HttpGet] public TestOption SnapshotTestOption() { return _snapshotTestOption.Value; } /// /// 获取命令参数 /// (仅支持字符串或Key=value两种形式) /// [HttpGet] public IActionResult CmdPara([Required(ErrorMessage = "命令行参数名必填")]string cmdName) { var cmdArgs = System.Environment.GetCommandLineArgs(); if (cmdArgs == null) { return Ok("启动时没有设置:命令行参数"); } var kvArgs = new Dictionary(); var singleArgs= new List(); foreach (var arg in cmdArgs) { var item = arg.Split('=').ToList(); if (item.Count ==1) { singleArgs.Add(item[0]); } if (item.Count == 2) { kvArgs.Add(item[0], item[1]); } } var result =string.Empty; var kvArg = kvArgs.FirstOrDefault(q=>q.Key == cmdName); if (kvArg.Key == cmdName) { result = kvArg.Value; return Ok($"{cmdName} 命令参数值为:{kvArg.Value} "); } var singleArg = singleArgs.FirstOrDefault(q=> q == cmdName); return Ok(singleArg ?? $"无 {cmdName} 命令参数 "); } /// /// 获取所有命令参数 /// [HttpGet] public IActionResult AllCmdPara() { var cmdArgs = System.Environment.GetCommandLineArgs(); if (cmdArgs == null) { return Ok("启动时没有设置:命令行参数"); } return Ok(cmdArgs); } /// /// 获取环境变量 /// [HttpGet] public IActionResult Evn([Required(ErrorMessage = "环境变量名必填")]string envName) { var envValue = System.Environment.GetEnvironmentVariable(envName); return Ok(envValue??"无此环境变量"); } /// /// 获取AspNetCore环境变量 /// (以ASPNETCORE_开头) /// [HttpGet] public IActionResult AspNetCoeEvn() { var envValues = System.Environment.GetEnvironmentVariables(); if (envValues == null) { return Ok("无环境变量!"); } var keys = envValues.Keys.Cast().ToList(); foreach (var key in keys) { if (string.IsNullOrEmpty(key)) { continue; } if (key.ToString().ToUpper().StartsWith("ASPNETCORE_") == false) { envValues.Remove(key); } } return Ok(envValues); } /// /// 获取所有环境变量 /// [HttpGet] public IActionResult AllEvn() { var envValues = System.Environment.GetEnvironmentVariables(); return Ok(envValues); } /// /// 获取配置项 /// [HttpGet] public IActionResult ConfigItem([Required(ErrorMessage = "配置项名称必填")]string itemName) { var envValue = _configuration.GetValue(itemName); return Ok(envValue ?? "无此配置变量"); } /// /// 获取所有配置项 /// [HttpGet] public IActionResult AllConfigItes() { return Ok(_configuration.GetChildren()); } /// /// 获取配置源 /// [HttpGet] public IActionResult ConfigProviders() { var root = _configuration as ConfigurationRoot; var providers = root.Providers.Select(p=>new { Name=p.GetType().FullName, }); return Ok(providers); } } }