=================================
launchsettings.json profiles 定义文件
=================================
文件位置: ropertieslaunchSettings.json, 该文件在 dotnet core 项目启动时会被自动加载, 不同的dotnet项目类型, 会有不同格式的launchsettings.json, 一旦项目类型确定后, 这个json文件的可配置项也就确定下来了, 所以我们不能在该json文件中增加配置项.
对于 BlazorWebAssembly 类型的项目, 这个配置文件包含两个部分, 一个是 iisSettings 配置(不重要, 暂时忽略), 另一个是 profiles 配置. 默认 BlazorWebAssembly 提供了两个 profile, 我们也可以增加新的 profile, 比如增加 stg/dev/prod 几个环境的profile.
但需要说明的是, 因为 launchsettings.json 格式是固定的, 这里仅仅是增加了多个stg/dev/prod profile 名, 我们不能直接在这里增加自定义的配置项.
如何为 dotnet 程序指定 profile?
在 dotnet run 命令行中加上 --launch-profile 参数, 即可指定要加载的 profile.
dotnet run --launch-profile <launch-profile>
可以在该 json 文件头指定其 schema 信息, 这样 vscode 就能提供自动补全编辑功能.
"$schema":"http://json.schemastore.org/launchsettings.json"
定义一个 blazorDemo1-dev profile:
"blazorDemo1-dev": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "dev" } }
需要特别说明的是:
commandName 是指定 asp.net core 的启动模式, 取值应该设置为 Project, 但我估计对于blazor wasm 应该不重要
ASPNETCORE_ENVIRONMENT 设定具体的env名, 这个env在 appsettings.json 文件中会使用到.
启用 blazorDemo1-dev profile的命名:
dotnet run --launch-profile blazorDemo1-dev
=================================
appsettings.json 应用程序自定义配置文件
=================================
launchSettings.json 不允许增加自定义配置项, 但 wwwrootappsettings.json 可以增加, 甚至可为不同的 env 定义不同的 appsettings.json 文件, 文件名规范是: appsettings.{ASPNETCORE_ENVIRONMENT}.json
以 blazorDemo1-dev profile 为例, 因为 ASPNETCORE_ENVIRONMENT 取值为 dev, 所以可增加一个 appsettings.dev.json 配置文件, 这样就相当于有两个配置文件, appsettings.json 和 appsettings.dev.json , 如果一个配置项在两个文件中都定义了, 自然以指定环境的配置文件为准.
需要说明的是 appsettings.json 配置文件, 在浏览器端是完全可见的, 所以不能用来存储敏感信息.
appsettings.json 文件内容:
{ "appid":"appid123", //普通key value "aaa.a1":"default", //构造多层 section , 代码上不认为是多层 "bbb":{ //构造真实的多层 section "b1":"b1value", "b2":"b2value" }, "ccc:c1":"c1value", //另一种构造真实的多层 section 的写法,完全等价于上面 bbb section "ccc:c2":"c2value" }
Program.cs 文件读取配置的代码:
public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); //读取 appsettings.json 文件的 aaa.a1 取值 var a1=builder.Configuration["aaa.a1"]; Console.WriteLine("aaa.a1="+a1); //多层section取值, 方法1: 使用Bind的方式先获取第一层 section, 然后使用 Dictionary<k,v> 来获取第二层 section值 var dict=new Dictionary<string, string>(); builder.Configuration.Bind("bbb",dict); Console.WriteLine("bbb:b1="+dict["b1"]); //多层section取值, 方法2: 使用冒号表达叶子节点, 即可直接获取叶子节点的值 var b1Another=builder.Configuration["bbb:b1"]; Console.WriteLine("bbb:b1="+b1Another); await builder.Build().RunAsync(); }
=================================
为应用程序增加基于内存的Configuration data
=================================
上面讲过 appsettings.json 会被自动下载到浏览器端, 所以绝对不能存敏感, 这里给出一个安全性稍微好一点的方法, 将配置项写死到C#代码中, 微软提供了MemoryConfigurationSource 类, 使用这个类设置配置项, 在读取的时候, 完全和 appsettings.json 一样, 非常方便.
Program.cs 文件设置配置的代码:
using Microsoft.Extensions.Configuration.Memory; public static async Task Main(string[] args) { //other code var builder = WebAssemblyHostBuilder.CreateDefault(args); var dict2=new Dictionary<string, string>(); dict2.add("xxx.x1":"x1value"); //包含xxx.x1一个层次section dict2.add("yyy:y1":"y1value"); //包含yyy 和 y1两个层次section dict2.add("yyy:y2":"y2value"); //包含yyy 和 y2两个层次section var memoryCfg=new MemoryConfigurationSource(){InitialData=dict2}; builder.Configuration.Add(memoryCfg); //other code }
=================================
在 razor 文件中使用依赖注入的方式获取 configuration data
=================================
前面示例都是在 Program.cs 中读取 appsettings 设置, 其实在 razor 文件中, 读取也非常方便, 注入一个 IConfiguration 对象.
@using Microsoft.Extensions.Configuration @inject IConfiguration Configuration public void getCfgValue() { //读取 appsettings.json 文件 var x1=Configuration["xxx.x1"]; Console.WriteLine("xxx.x1="+x1); var y1=Configuration["yyy:y1"]; Console.WriteLine("yyy:y1="+y1); }