在.NET 6.0中配置WebHostBuilder
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。
在阅读第4章“使用Kestrel配置和定制HTTPS”时,您可能会产生一些疑问:
- 如何使用用户加密机制将密码传递到HTTPS配置?
 - 您甚至可能想知道是否可以从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的更多相关文章
- 在 vSphere 5.x/6.0 中配置 Network Dump Collector 服务 (2002954)
		
vmware KB: https://kb.vmware.com/s/article/2002954?lang=zh_CN 重点配置命令: 使用 vSphere Client 连接到 vCenter ...
 - Vue-Cli 3.0 中配置高德地图
		
vue 中使用高德地图有两种方式 一.vue-amap 组件 官网: https://elemefe.github.io/vue-amap/#/ 开始的时候是打算用这个组件做地图功能的,但是尝试之后存 ...
 - React 版本16.9.0 中配置路由以及路由传参
		
我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": &q ...
 - (win7) 在IIS6.0 中配置项目
		
1.进入IIS管理器 右击“计算机”->管理->服务和应用程序->Internet信息服务(IIS)管理器 2.将项目加入IIS中 网站->右击“默认网站”->添加虚拟目 ...
 - wxWidgets编译和在VC 6.0中的配置
		
1. 安装 运行wxMSW-2.8.3-Setup1.exe,将之安装到不带空格符号的目录中,本例为C:/wxWidgets-2.8.3: 2. 编译和配置 (1) 用VC6.0编译 进入C: ...
 - 在 IIS  中配置 ASP.NET 应用程序
		
注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...
 - Spring Boot 2.0 教程 | 配置 Undertow 容器
		
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发于个人网站 https://ww ...
 - VC++ 6.0 sqlite3 配置、测试
		
/************************************************************************************* * VC++6.0 sql ...
 - NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因
		
认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...
 
随机推荐
- Windows Terminal无法加载WSL  [process exited with code 4294967295 (0xffffffff)]
			
在Windows Terminal中WSL无法打开错误代码是 process exited with code 4294967295 (0xffffffff),但在命令行中 通过 "C:\W ...
 - .NET混合开发解决方案9 WebView2控件的导航事件
			
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
 - Linux的快捷使用(不断更新中)
			
Linux 命令行提示符 ~代表当前目录,即家目录,#是超级用户提示符,如果是普通用户使用$ 基本快捷键的使用 移动光标命令 Ctrl+A:移动光标到开头 Ctrl+E:移动光标到结尾 Ctrl+F: ...
 - Solon 1.7.6 发布,更现代感的应用开发框架
			
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
 - 3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载
			
一.录制分类 在音视频会议.在线教育等系统中,录制是一个特别重要的功能 录制一般分为服务端录制和客户端录制 服务端录制:优点是不用担心客户因自身电脑问题造成录制失败(如磁盘空间不足),也不会因录制时抢 ...
 - npm 是什么?
			
npm 是什么? 本文写于 2020 年 6 月 16 日 最近帮几个同学装开发环境,发现他们会各种"卡死"在 npm 安装一些包的过程中. 他们会非常纠结这个命令我明明敲的和网上 ...
 - react 疑问集锦
			
在 setState 后未 re-render function component 初始化调用接口
 - AJAX——POST请求
			
POST.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
 - 【freertos】009-任务控制
			
目录 前言 9.1 相对延时 9.1.1 函数原型 9.1.2 函数说明 9.1.3 参考例子 9.2 绝对延时 9.2.1 函数原型 9.2.2 函数说明 9.2.3 参考例子 9.3 获取任务优先 ...
 - Go微服务框架go-kratos实战01:quickstart 快速开始
			
先来感受下用 kratos 快速创建项目 一.环境准备 1.1 安装依赖软件 protoc protoc-gen-go 建议开启 GO111MODULE 1.2 安装 kratos cli go in ...