.net5 core 中的配置文件都是JSON格式的,這種格式具有對象化的特征,書寫更簡潔,且被大多數語言支持,
非常適合在微服務架構下使用。配置文件的讀取有兩種方式,
一種是傳統的Configuration模式,另一種是Option模式,下面分別介紹。
准備工作:
在解決方案資源管理器的根目錄下打開 appsettings.json 文件,加入如下代碼:
1 { 2 "ConnectionString": { 3 "MySql": "server=localhost;user=root;pwd=123;database=webapidemo", 4 "SqlServer": "server=localhost;database=webapidemo;integrated security=false;uid=sa;pwd=123", 5 "Oracle": "Provider=OraOLEDB.Oracle;Data Source=127.0.0.1:1521/webapidemo;User Id=admin;Password=123;" 6 } 7 }
在配置文件中定義了三種數據庫的連接字符串信息,下面看如何讀取這些信息。
一、Configuration模式
1. 引用using Microsoft.Extensions.Configuration; 名稱空間
2. 在UsersController.cs的構造函數中注入 Configuration 服務,代碼如下(紅色標注):
1 public class UsersController : ControllerBase 2 { 3 private IWebHostEnvironment _env; 4 private ILogger<UsersController> _logger; 5 private readonly IConfiguration _configuration; 6 private IUserDao _userDao; 7 public UsersController(IWebHostEnvironment env, ILogger<UsersController> logger, IConfiguration configuration, IUserDao userDao) 8 { 9 _env = env; 10 _logger = logger; 11 _configuration = configuration; 12 _userDao = userDao; 13 } 14 15 //... 16 }
3. 新增終結點 ReadConfiguration( ) ,路由屬性是 [Route("configuration")],代碼如下:
1 [Route("configuration")] 2 [HttpGet] 3 [AllowAnonymous] 4 public ContentResult ReadConfiguration() 5 { 6 string mySql = _configuration["ConnectionString:MySql"]; 7 string sqlServer = _configuration["ConnectionString:SqlServer"]; 8 string oracle = _configuration["ConnectionString:Oracle"]; 9 10 string allcs = "MySql:" + mySql + Environment.NewLine + 11 "SqlServer:" + sqlServer + Environment.NewLine + 12 "Oracle:" + oracle + Environment.NewLine; 13 14 return Content(allcs); 15 }
編碼很簡單,使用IConfiguration的實例用索引的方式就可以讀取配置信息了,
配置文件中多層嵌套的值只需要按由外到里的順序用冒號":"分割。
打開POSTMAN訪問網址:http://localhost:52384/api/users/configuration,結果如下:
二、Option模式
此模式是將配置信息讀取到自定義的類中,然后以服務的形式提供給外部使用,步驟如下:
1 . 在解決方案根目錄中新建Options的文件夾,在里面新增一個類文件 ConnectionStringOptions.cs
2 . ConnectionStringOptions.cs中代碼如下:
1 public class ConnectionStringOptions 2 { 3 public const string ConnectionString = "ConnectionString"; 4 5 public string MySql { get; set; } 6 public string SqlServer { get; set; } 7 public string Oracle { get; set; } 8 }
3. 新增終結點 ReadOption( ) ,路由屬性是 [Route("option")],代碼如下:
1 [Route("option")] 2 [HttpGet] 3 [AllowAnonymous] 4 public ContentResult ReadOption() 5 { 6 ConnectionStringOptions csOptions = new ConnectionStringOptions(); 7 _configuration.GetSection(ConnectionStringOptions.ConnectionString).Bind(csOptions); 8 9 //也可以用泛型的Get( )方法 10 //csOptions = _configuration.GetSection(ConnectionStringOptions.ConnectionString) 11 .Get<ConnectionStringOptions>(); 12 13 14 string allcs = "===Option===" + Environment.NewLine + 15 "MySql:" + csOptions.MySql + Environment.NewLine + 16 "SqlServer:" + csOptions.SqlServer + Environment.NewLine + 17 "Oracle:" + csOptions.Oracle + Environment.NewLine; 18 19 return Content(allcs); 20 }
使用_configuration的 GetSection( ) 方法獲取指定區間的配置信息,
然后調用Bind()方法將配置文件中的值綁定到我們定義的類ConnectionStringOptions.cs的實例上。
(注:類中的屬性名必須和配置文件中的屬性名相同,使用的時候直接訪問實例的屬性就可以了)。
打開POSTMAN訪問網址:http://localhost:52384/api/users/option,結果如下:
4 . 在ReadOption( ) 方法中,建立配置文件到 ConnectionStringOptions 實例的映射是通過如下兩行代碼實現的:
1 ConnectionStringOptions csOptions = new ConnectionStringOptions(); 2 _configuration.GetSection(ConnectionStringOptions.ConnectionString).Bind(csOptions);
還有一種更好的處理方式是將 ConnectionStringOptions 注冊到Service容器中,
在調用的地方通過構造函數注入的方式來使用,步驟如下:
第1步:在Startup.cs的構造方法中注入 Configuration 的實例,代碼如下:
1 public class Startup 2 { 3 public IConfiguration Configuration { get; } 4 5 6 public Startup(IConfiguration configuration) 7 { 8 Configuration = configuration; 9 } 10 11 12 //... 13 }
第2步:在Startup.cs文件的 ConfigureServices( ) 方法中注冊 ConnectionStringOptions 服務,代碼如下(紅色標注):
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddControllers(); 4 5 services.AddScoped<IUserDao, MySqlUserDao>(); 6 7 services.Configure<ConnectionStringOptions>( //使用泛型方法來獲取自定義類的實例 8 Configuration.GetSection(ConnectionStringOptions.ConnectionString) 9 ); 10 11 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer( 12 //設置Token解析的參數 13 options => 14 { 15 options.TokenValidationParameters = new TokenValidationParameters() 16 { 17 ValidateIssuer = false, //不驗證 issuer,因為 GenerateJwtToken() 方法生成的Token中issuer = null 18 ValidateAudience = false, //同上 19 20 //如果希望 Token 在規定時間后失效請設置成 true 21 //本例中 GenerateJwtToken()方法設置的值是 new DateTime(2020, 3, 1) 22 ValidateLifetime = false, 23 24 //需要驗證簽名key並與 GenerateJwtToken() 方法中的key保持一致 25 ValidateIssuerSigningKey = true, 26 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdefghijklmn1234567890")) 27 }; 28 } 29 ); 30 }
第3步:在UsersController.cs中引用名稱空間 using Microsoft.Extensions.Options;
第4步:在UsersController.cs的構造函數中注入 ConnectionStringOptions 服務,代碼如下(紅色標注):
1 public class UsersController : ControllerBase 2 { 3 private IWebHostEnvironment _env; 4 private ILogger<UsersController> _logger; 5 private readonly IConfiguration _configuration; 6 private readonly ConnectionStringOptions _options; 7 private IUserDao _userDao; 8 public UsersController(IWebHostEnvironment env, 9 ILogger<UsersController> logger, 10 IConfiguration configuration, 11 IOptions<ConnectionStringOptions> options, 12 IUserDao userDao) 13 { 14 _env = env; 15 _logger = logger; 16 _configuration = configuration; 17 _options = options.Value; 18 _userDao = userDao; 19 } 20 21 //... 22 23 }
第5步:新增終結點 ReadOption2( ) ,路由屬性是 [Route("option2")],代碼如下:
1 [Route("option2")] 2 [HttpGet] 3 [AllowAnonymous] 4 public ContentResult ReadOption2() 5 { 6 string allcs = "===Option2===" + Environment.NewLine + 7 "MySql:" + _options.MySql + Environment.NewLine + 8 "SqlServer:" + _options.SqlServer + Environment.NewLine + 9 "Oracle:" + _options.Oracle + Environment.NewLine; 10 11 return Content(allcs); 12 }
直接使用構造函數中注入的ConnectionStringOptions實例 _options。
打開POSTMAN訪問網址:http://localhost:52384/api/users/option2,結果如下:
和前面得到的結果一致。