大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。

在阅读第4章“使用Kestrel配置和定制HTTPS”时,您可能会产生一些疑问:

  1. 如何使用用户加密机制将密码传递到HTTPS配置?
  2. 您甚至可能想知道是否可以从Program.cs中获取配置?

在本章,我们将通过WebHostBuilderContext这个知识点来解答上面的疑问。

1

还记得在第四章当中,我们在Program.cs这个文件进行WebHostBuilder Kestrel的相关配置。当时我们使用用户秘钥(user secrets)来配置证书密码,如以下代码段所示:

public class Program {     
public static void Main(string[] args)  
{         
CreateHostBuilder(args).Build().Run();     
}     
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>  
{
webBuilder.UseKestrel(options =>  {
options.Listen(IPAddress.Loopback, 5000);                         
options.Listen(IPAddress.Loopback, 5001,listenOptions  => { listenOptions.UseHttps("certificate.pfx","topsecret");  }); }).UseStartup();});
}
}

此代码段对于.NET 5.0和早期版本仍然有效,对于.NET 6.0中的几乎所有Web项目也有效。但对于使用Web项目模板创建的项目无效,比如你可能通过以下命令行的方式创建项目:

dotnet new web -n HostBuilderConfig -o HostBuilderConfig

.NET 6.0以后的迷你API的Program.cs文件代码如下所示:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

配置在迷你API中看起来是这样的:

using System.Net;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseKestrel(options => {
options.Listen(IPAddress.Loopback, 5000);     
options.Listen(IPAddress.Loopback, 5001, listenOptions => {
listenOptions.UseHttps("certificate.pfx","topsecret");
});
});

下面的代码适用于.NET 6.0及以前版本中的所有项目模板。

.UseKestrel((host, options) => {     // ... })

第一个参数host是WebHostBuilderContext实例,可以使用它访问配置信息。

builder.WebHost.UseKestrel((host, options) => {     
var filename = host.Configuration.GetValue("AppSettings:certfilename", "");     
var password = host.Configuration.GetValue("AppSettings:certpassword", "");     
options.Listen(IPAddress.Loopback, 5000);     
options.Listen(IPAddress.Loopback, 5001, listenOptions => {
listenOptions.UseHttps(filename, password);         
});
});

在本例中,我们使用冒号分隔符读取Json配置文件里的值,Json文件如下所示:

{     
"AppSettings": {"certfilename": "certificate.pfx", "certpassword": "topsecret" },     
"Logging": { "LogLevel": { "Default": "Warning"}},
"AllowedHosts": "\*"
}

提示:上面是一个如何从json读取配置来配置Kestrel的示例。切记不要在代码中存储任何秘钥凭证(credentials),而是从用户秘钥存储库中读取密钥。具体用法可以在项目文件夹中执行以下.NET CLI命令行进行设置:

dotnet user-secrets init
dotnet user-secrets set "AppSettings:certfilename" "certificate.pfx"
dotnet user-secrets set "AppSettings:certpassword" "topsecret"

以上也适用于环境变量:

SET APPSETTINGS_CERTFILENAME=certificate.pfx
SET APPSETTINGS_CERTPASSWORD=topsecret

提示:由于用户秘钥的存储仅用于本地开发,因此应通过环境变量将凭据传递给生产中的应用程序或类生产环境的应用程序。

2

以上过程应该如何操作呢?

不知道大家还记不记得 ASP.NET Core 1.0在Startup.cs里的配置方法?当时主要是在StartUp类的构造函数中配置的,添加用户凭证的过程类似,大家可以比对一下:

var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional:  true);
if (env.IsDevelopment()) {
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();

这段代码现在封装在CreateDefaultBuilder方法中,如下所示:

builder.ConfigureAppConfiguration((hostingContext, config) => {
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json",optional: true,reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional: true,reloadOnChange: true);     
if (env.IsDevelopment()) {       
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));        
if (appAssembly != null) {  
config.AddUserSecrets(appAssembly, optional: true);  
}
}     
config.AddEnvironmentVariables();     
if (args != null) { config.AddCommandLine(args); }
});

我们看到代码几乎没什么变化,Kestrel支持appsettings.json的文件配置或者使用环境变量指定端口、URL等。我们看下WebHost.cs里的代码:

builder.UseKestrel((builderContext, options) => {
options.Configure(builderContext.Configuration.GetSection("Kestrel"));
})

以上代码通过appsettings.json文件进行Kestrel相关配置:

"Kestrel": { "EndPoints": {"Http": { "Url": "http://localhost:5555" }} }

或者,可以使用以下环境变量来配置:

SET KESTREL_ENDPOINTS_HTTP_URL=http://localhost:5555

3

好,主体内容介绍差不多了,简单回顾一下本章中介绍的内容:

在Program.cs文件的配置方法中,我们可以通过lambda进行应用程序配置,这里有一个重要的对象WebHostBuilderContext,该对象基本上可以满足我们常用的各自配置需求。

在下一章中,我们将介绍托管模型的详细信息,包括不同的托管模型以及如何通过不同方式托管ASP.NET Core应用程序。

在.NET 6.0中配置WebHostBuilder的更多相关文章

  1. 在 vSphere 5.x/6.0 中配置 Network Dump Collector 服务 (2002954)

    vmware KB: https://kb.vmware.com/s/article/2002954?lang=zh_CN 重点配置命令: 使用 vSphere Client 连接到 vCenter ...

  2. Vue-Cli 3.0 中配置高德地图

    vue 中使用高德地图有两种方式 一.vue-amap 组件 官网: https://elemefe.github.io/vue-amap/#/ 开始的时候是打算用这个组件做地图功能的,但是尝试之后存 ...

  3. React 版本16.9.0 中配置路由以及路由传参

    我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": &q ...

  4. (win7) 在IIS6.0 中配置项目

    1.进入IIS管理器 右击“计算机”->管理->服务和应用程序->Internet信息服务(IIS)管理器 2.将项目加入IIS中 网站->右击“默认网站”->添加虚拟目 ...

  5. wxWidgets编译和在VC 6.0中的配置

    1. 安装  运行wxMSW-2.8.3-Setup1.exe,将之安装到不带空格符号的目录中,本例为C:/wxWidgets-2.8.3:   2. 编译和配置 (1) 用VC6.0编译  进入C: ...

  6. 在 IIS 中配置 ASP.NET 应用程序

     注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...

  7. Spring Boot 2.0 教程 | 配置 Undertow 容器

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发于个人网站 https://ww ...

  8. VC++ 6.0 sqlite3 配置、测试

    /************************************************************************************* * VC++6.0 sql ...

  9. NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

随机推荐

  1. 论文阅读 Dynamic Graph Representation Learning Via Self-Attention Networks

    4 Dynamic Graph Representation Learning Via Self-Attention Networks link:https://arxiv.org/abs/1812. ...

  2. 想学会SOLID原则,看这一篇文章就够了!

    背景 在我们日常工作中,代码写着写着就出现下列的一些臭味.但是还好我们有SOLID这把'尺子', 可以拿着它不断去衡量我们写的代码,除去代码臭味.这就是我们要学习SOLID原则的原因所在. 设计的臭味 ...

  3. SpringBoot从0到0.7——第一天

    SpringBoot从0到0.7--第一天 学习的第一步当然是收拾好心情,先把环境搭建起来,写出第一个helloword出来. 第一步:安装IDEA和Tomcat 我安装的是IDEA 2021.2.2 ...

  4. AM57x 多核SoC开发板——GPMC的多通道AD采集综合案例手册(上)

    目 录 1 ----案例功能 2 ----操作说明 2.1 ----硬件连接 2.2 ----案例测试 2.3 ----使用CCS查看信号波形 2.3.1 ----加载Symbols信息表 2.3.2 ...

  5. Nexus5x 修改Android开机动画

    1.制作帧动画 这里随便从网上找了一个gif图片,导入PS中,打开后会形成很多帧图层,选择导航栏中的文件->脚本->将图层导出到文件可以将所有图层导出来.要注意文件命名,Android会按 ...

  6. Spring-boot整合Activiti7

    Spring-boot整合Activiti7 pom.xml    <properties>        <maven.compiler.source>15</mave ...

  7. Docker 与 K8S学习笔记(二十三)—— Kubernetes集群搭建

    小伙伴们,好久不见,这几个月实在太忙,所以一直没有更新,今天刚好有空,咱们继续k8s的学习,由于我们后面需要深入学习Pod的调度,所以我们原先使用MiniKube搭建的实验环境就不能满足我们的需求了, ...

  8. MOS管实现的STC自动下载电路

    目录 MOSFET, MOS管基础和电路 MOS管实现的STC自动下载电路 三极管配合 PMOS 管控制电路开关 STC MCU在烧录时, 需要断电重置后才能进入烧录状态, 通常是用手按开关比较繁琐. ...

  9. Redis - 读写模式 - 缓存一致性

    Cache Aside Pattern(旁路缓存模式) 读:从cache中读取数据,若读取到则直接返回:cache中不存在则去database中读取,然后更新到cache. 写:先更新database ...

  10. C++ 之多态总结

    前言 最近为了完成数据库系统的实验,又复习起了<C++ Primer>,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的,没有领会多态的奥妙,学完 Java 之 ...