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

在阅读第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. 为什么 io 包一般以 byte 数组做为处理单位?

    为什么 io 包一般以 byte 数组做为处理单位? 本文写于 2021 年 9 月 7 日 编程语言中时常会出现 []byte 作为类型的操作.特别是在网络传输或是 io 操作中,例如 socket ...

  2. 脚踏实地的Netty源码研究笔记——开篇

    1. 脚踏实地的Netty源码研究笔记--开篇 1.1. Netty介绍 Netty是一个老牌的高性能网络框架.在众多开源框架中都有它的身影,比如:grpc.dubbo.seata等. 里面有着非常多 ...

  3. 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等

    温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...

  4. Stream.toList()和Collectors.toList()的性能比较

    昨天给大家介绍了Java 16中的Stream增强,可以直接通过toList()来转换成List. 主要涉及下面这几种转换方式: list.stream().toList(); list.stream ...

  5. Vben Admin 源码学习:项目初始化

    0x00 前言 Vue-Vben-Admin 是一个免费开源的中后台模版.使用了最新的vue3,vite2,TypeScript等主流技术开发,开箱即用的中后台前端解决方案考. 本系列本着学习参考的目 ...

  6. ARM学习1

    ARM相关概念 1.ARM的发展史 1. 1978年,CPU公司 Cambridge processing Unit 2. 1979年 Acorn 3. 1985年, 32位,8MHz, 使用的精简指 ...

  7. 【题解】Codeforces Round #798 (Div. 2)

    本篇为 Codeforces Round #798 (Div. 2) 也就是 CF1689 的题解,因本人水平比较菜,所以只有前四题 A.Lex String 题目描述 原题面 给定两个字符串 \(a ...

  8. 开发工具-MySQL下载地址

    更新记录 2022年6月10日 完善标题. 商业版下载 商业版下载地址 https://edelivery.oracle.com/ 使用Oracle账号登录即可下载. 官方下载 https://dev ...

  9. redis击穿,穿透,雪崩,分布式锁,api(jedis,luttuce)

    击穿:(redis做缓存用,肯定发生了高并发,到达数据库查询) 设置key 的过期时间,过期后没有这个key,找不到了,就穿过了(其中一个key过期导致并发访问数据库) LRU (LRU,即:最近最少 ...

  10. powershell命令总结

    2021-07-21 初稿 ps命令采用动词-名词的方式命名,不区分大小写.默认当前文件夹为当前路径./.除去-match使用正则表达式匹配外,其他都使用*和?通配符. 速查 管道命令 前一个的输出作 ...