在.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 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...
随机推荐
- SpringBoot从0到0.7——第四天
SpringBoot从0到0.7--第四天 今天进行实战开发一个小项目,SpringBoot和Thymeleaf集成的小项目 因为懒得写写前端,直接找的别人的项目在它的的基础上进行配置,进行修改.gi ...
- 超全面!1.5w字总结50个Java经典基础面试题(已根据知识点分类)
大家好,我是fancy. 在面试中将基础问题回答好就是成功的一半. 我总结了50道经典的Java基础面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类,可以说非常全面了. 小伙伴们点赞 ...
- 好客租房14-在jsx中使用javascript表达式的注意点
注意点 单大括号中可以使用任意的表达式 jsx自身也是js表达式 注意:js中的对是一个例外 写在style样式中 //导入react import React from "reac ...
- typora的下载和基本的使用
目录 typora的下载和基本的使用 typora的下载 typora基本的使用 选择自己喜爱的主题 创建标题 进入编程环境 改变文本样式 插入链接 插入图片 有序列表 无序列表 创建表格 单选框 表 ...
- pip下载更改为清华镜像
step1: + 在user(用户)下新建一文件夹再在该文件夹下新建pip.ini文件 + 例如:user/pip/pip.ini + tips:如果未打开在查看里的隐藏扩展名记得打开 step2: ...
- MySQL锁(乐观锁、悲观锁、多粒度锁)
锁 并发事务可能出现的情况: 读-读事务并发:此时是没有问题的,读操作不会对记录又任何影响. 写-写事务并发:并发事务相继对相同的记录做出改动,因为写-写并发可能会产生脏写的情况,但是没有一个隔离级别 ...
- JAVA - 如何判断一个类是无用的类
JAVA - 如何判断一个类是无用的类 方法区主要回收的是无用的类,那么如何判断一个类是无用的类的呢? 判定一个常量是否是"废弃常量"比较简单,而要判定一个类是否是"无用 ...
- wsl2环境搭建
序言 我电脑配置不高,开虚拟机跑linux总觉得太卡.最近才了解到windows早就上了wsl2--一款较为轻量的虚拟机软件.所以本篇博客偏笔记向,存粹记录以便多次使用. 环境 宿主机windows1 ...
- Linux安装netstat命令
Linux安装netstat命令 1.查找netstat命令所属的依赖包 [root@localhost ~]# yum provides netstat netstat命令的安装包为net-tool ...
- 接口开发-restful
数据库表设计 1 --员工表 2 create table Employee 3 ( 4 id NUMBER primary key, 5 employeeID NUMBER not null, 6 ...