文章目录
ASP.NET Core 应用程序的标准入口点,用于配置和启动一个 Web 主机(WebHost)。
`InProcess` 代码分析
解决 HTTP Error 500.31 – Failed to load ASP.NET Core runtime 的完整方案
**`launchSettings.json` 配置文件分析**
ASP.NET Core 中的配置源详解
ASP.NET Core 应用程序的标准入口点,用于配置和启动一个 Web 主机(WebHost)。
1. Main 方法
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
• 作用:程序的入口方法,负责启动 Web 应用程序。
• 流程:
CreateWebHostBuilder(args):创建一个 IWebHostBuilder 实例,用于配置 Web 主机。
.Build():根据配置构建 IWebHost(Web 主机)。
.Run():启动 Web 主机,开始监听 HTTP 请求。
2. CreateWebHostBuilder 方法
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
• 作用:创建并配置 IWebHostBuilder,定义应用程序的启动逻辑。
• 关键组件:
• WebHost.CreateDefaultBuilder(args)
使用默认配置初始化 Web 主机,包括:
◦ Kestrel 作为默认 Web 服务器。
◦ 配置文件加载(如 `appsettings.json`)。
◦ 日志系统(如控制台、Debug 输出)。
◦ 依赖注入(DI)容器。
• .UseStartup<Startup>()
指定启动类 `Startup`,用于进一步配置服务和中间件:
```csharp
public class Startup
{
public void ConfigureServices(IServiceCollection services) { /* 注册服务 */ }
public void Configure(IApplicationBuilder app) { /* 配置中间件 */ }
}
```
3. 代码优化建议
(1) 添加配置增强
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((hostingContext, config) =>
{
// 加载环境变量或自定义 JSON 文件
config.AddEnvironmentVariables()
.AddJsonFile("customsettings.json", optional: true);
})
.ConfigureLogging(logging =>
{
// 自定义日志过滤
logging.AddFilter("Microsoft", LogLevel.Warning);
});
(2) 支持 HTTPS 和端口绑定
.UseKestrel(options =>
{
options.Listen(IPAddress.Any, 5000); // HTTP
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.UseHttps("certificate.pfx", "password");
});
})
(3) 集成 Serilog 日志库
.UseSerilog((hostingContext, loggerConfig) =>
{
loggerConfig.ReadFrom.Configuration(hostingContext.Configuration);
})
4. 典型应用场景
• Web API:托管 RESTful 服务。
• MVC 应用:运行基于 Razor 或 Blazor 的 Web 应用。
• 微服务:作为独立服务节点运行。
5. 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 启动失败 | 端口冲突 | 修改 launchSettings.json 或显式指定端口 |
| 依赖注入错误 | 服务未注册 | 检查 Startup.ConfigureServices |
| 配置未加载 | 文件路径错误 | 使用 config.AddJsonFile() 绝对路径 |
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> 代码分析
1. 配置位置
此配置通常出现在 ASP.NET Core 项目文件(.csproj) 中,例如:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
</Project>
2. 作用与意义
该配置决定 ASP.NET Core 应用程序的 托管模式,可选值:
• InProcess(默认值)
应用程序直接在 IIS 工作进程(w3wp.exe)中运行,性能更高。
• OutOfProcess
应用程序通过 dotnet.exe 独立进程运行,IIS 仅作为反向代理。
3. 工作原理对比
| 特性 | InProcess | OutOfProcess |
|---|---|---|
| 进程模型 | 运行在 IIS 工作进程内 | 运行在独立的 dotnet.exe 进程 |
| 性能 | 更高(无进程间通信开销) | 较低(需通过 HTTP 转发) |
| 调试支持 | 可直接附加到 IIS 进程调试 | 需附加到 dotnet.exe 进程 |
| 适用场景 | 生产环境(IIS 部署) | 开发环境(跨平台兼容性) |
| 日志输出位置 | IIS 事件日志 | 控制台或自定义日志文件 |
4. 底层机制
• InProcess 模式下:
ASP.NET Core 模块(ANCM)直接加载 aspnetcorev2_inprocess.dll,将请求转发到应用的 Main 方法。
• OutOfProcess 模式下:
IIS 启动 dotnet.exe 进程,通过 Kestrel 监听端口(默认 5000),IIS 反向代理到该端口。
5. 代码影响示例
(1) Program.cs 中的差异
var builder = WebApplication.CreateBuilder(args);
// InProcess 模式下,以下配置可能被 IIS 覆盖:
builder.WebHost.UseIIS(); // 显式启用 IIS 集成
builder.WebHost.UseIISIntegration(); // 启用 IIS 中间件
var app = builder.Build();
app.Run();
(2) 部署时的 web.config
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" />
</handlers>
<aspNetCore processPath="dotnet"
arguments=".MyApp.dll"
hostingModel="inprocess" /> <!-- 此处与 csproj 配置同步 -->
</system.webServer>
</configuration>
6. 性能优化建议
• 生产环境:优先使用 InProcess,减少 20%~30% 的请求延迟。
• 开发环境:可切换为 OutOfProcess 便于调试和日志查看。
• 强制验证:通过代码检查当前模式:
if (builder.Environment.IsProduction())
{
builder.WebHost.UseIISIntegration();
}
解决 HTTP Error 500.31 – Failed to load ASP.NET Core runtime 的完整方案
问题分析
错误信息显示您的应用程序需要 .NET Core 2.2.0 运行时,但您的系统上安装的是其他版本(2.1/3.1/5.0/6.0/7.0/8.0/9.0)。
最佳解决方案
方案1:
下载.NET Core 2.2运行时:
• 官方下载页面
launchSettings.json 配置文件分析
这个文件是 ASP.NET Core 项目的启动配置文件,主要用于定义 开发环境 下的运行方式(如 IIS Express 或 Kestrel)。
1. 文件结构
{
"iisSettings": {
... }, // IIS Express 相关配置
"profiles": {
... } // 启动方案(Profile)配置
}
2. iisSettings 配置
"iisSettings": {
"windowsAuthentication": false, // 禁用 Windows 身份验证
"anonymousAuthentication": true, // 启用匿名身份验证
"iisExpress": {
"applicationUrl": "http://localhost:37505", // IIS Express 监听的 URL
"sslPort": 0 // 不使用 HTTPS(SSL 端口为 0)
}
}
作用
• windowsAuthentication
• false:不启用 Windows 集成身份验证(如 NTLM/Kerberos)。
• 适用于不需要域认证的开发环境。
• anonymousAuthentication
• true:允许匿名访问(默认)。
• iisExpress.applicationUrl
• 指定 IIS Express 监听的地址和端口(这里是 http://localhost:37505)。
• sslPort
• 0 表示 不启用 HTTPS(如需 HTTPS,可设为 44300 等端口)。
3. profiles 配置
profiles 定义 不同的启动方案(如 IIS Express 或 Project)。
(1) IIS Express 方案
"IIS Express": {
"commandName": "IISExpress", // 使用 IIS Express 运行
"launchBrowser": true, // 启动时自动打开浏览器
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" // 设置环境变量为 Development
}
}
适用场景
• 使用 IIS Express 作为 Web 服务器(模拟 IIS 行为)。
• 适合 调试 ASP.NET Core + IIS 集成 的场景。
(2) MockStudentManager 方案
"MockStudentManager": {
"commandName": "Project", // 使用 Kestrel 直接运行(不经过 IIS Express)
"launchBrowser": true, // 启动时自动打开浏览器
"applicationUrl": "http://localhost:5000", // Kestrel 监听的 URL
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" // 设置环境变量为 Development
}
}
适用场景
• 直接使用 Kestrel(ASP.NET Core 内置服务器)运行。
• 适合 纯开发调试(无 IIS 依赖),启动更快。
4. 关键区别
| 配置项 | IIS Express (IISExpress) |
Kestrel (Project) |
|---|---|---|
commandName |
IISExpress |
Project |
| 服务器 | IIS Express(模拟 IIS) | Kestrel(内置服务器) |
| 默认端口 | 随机分配(如 37505) |
手动指定(如 5000) |
| 适用场景 | 需要测试 IIS 集成时使用 | 快速开发调试 |
5. 如何选择启动方案?
(1) 使用 IIS Express
• 适用情况:
• 测试 IIS 相关功能(如 URL 重写、Windows 认证)。
• 模拟生产环境(生产环境用 IIS 托管)。
• 启动方式:
• 在 Visual Studio 顶部选择 IIS Express,然后按 F5。
(2) 使用 Kestrel(Project)
• 适用情况:
• 快速开发调试(启动更快)。
• 不需要 IIS 功能(如纯 API 开发)。
• 启动方式:
• 在 Visual Studio 顶部选择项目名称(如 MockStudentManager),然后按 F5。
ASP.NET Core 中的配置源详解
ASP.NET Core 提供了高度灵活的配置系统,支持从多种来源加载配置信息。
默认配置源(按优先级排序)
| 配置源 | 描述 | 代码示例 | 适用场景 |
|---|---|---|---|
| appsettings.json | 主配置文件 | builder.Configuration.AddJsonFile("appsettings.json") |
通用应用配置 |
| appsettings.{Environment}.json | 环境特定配置 | builder.Configuration.AddJsonFile($"appsettings.{env.EnvironmentName}.json") |
不同环境配置 |
| 环境变量 | 系统/进程环境变量 | 自动加载 | 容器/K8s部署 |
| 命令行参数 | 启动时传入参数 | builder.Configuration.AddCommandLine(args) |
动态调整配置 |
| 用户机密 | 开发敏感数据 | builder.Configuration.AddUserSecrets<Program>() |
开发环境密钥 |
扩展配置源
| 配置源 | 添加方式 | 需要NuGet包 | 典型用途 |
|---|---|---|---|
| Azure Key Vault | AddAzureKeyVault() |
Azure.Extensions.AspNetCore.Configuration.Secrets | 生产环境密钥管理 |
| INI文件 | AddIniFile() |
Microsoft.Extensions.Configuration.Ini | 兼容旧系统配置 |
| XML文件 | AddXmlFile() |
Microsoft.Extensions.Configuration.Xml | 企业级复杂配置 |
| 数据库 | 自定义Provider | – | 动态配置管理 |
| Consul | 第三方库 | – | 分布式配置中心 |
**配置系统核心特性
var builder = WebApplication.CreateBuilder(args);
// 手动添加配置源示例
builder.Configuration
.AddJsonFile("custom.json", optional: true)
.AddEnvironmentVariables("MYAPP_")
.AddCommandLine(args);
配置绑定最佳实践
// 类定义
public class AppSettings {
public string ConnectionString {
get; set; }
public int Timeout {
get; set; }
}
// 绑定方式
var settings = new AppSettings();
builder.Configuration.Bind("SectionName", settings);
// 或
var settings = builder.Configuration.GetSection("SectionName").Get<AppSettings>();
**环境相关配置策略
// 开发环境加载机密
if (builder.Environment.IsDevelopment()) {
builder.Configuration.AddUserSecrets<Program>();
}
// 生产环境使用Key Vault
if (builder.Environment.IsProduction()) {
builder.Configuration.AddAzureKeyVault(
new Uri("https://your-vault.vault.azure.net/"),
new DefaultAzureCredential());
}
**配置验证
services.Configure<AppSettings>(builder.Configuration.GetSection("SectionName"))
.ValidateDataAnnotations();
**热重载支持
// 添加文件监控
builder.Configuration.AddJsonFile("appsettings.json",
optional: true,
reloadOnChange: true);
**配置提供程序比较
| 提供程序 | 动态更新 | 安全性 | 适用规模 |
|---|---|---|---|
| 文件配置 | 需启用reload | 低 | 单机应用 |
| 环境变量 | 需重启 | 中 | 容器化部署 |
| Key Vault | 实时 | 高 | 云原生应用 |
| 数据库 | 实时 | 依赖实现 | 企业应用 |
**配置覆盖规则
后添加的源优先级更高
同键名时后加载的值会覆盖先前的值
环境变量会覆盖JSON文件中的配置
**最佳实践建议
生产环境敏感数据必须使用Key Vault
开发环境使用User Secrets避免提交密钥
多环境配置采用appsettings.{Environment}.json模式
复杂配置使用Options模式进行强类型绑定
容器化部署优先使用环境变量
**调试技巧
// 查看所有配置值
var allConfigs = string.Join("
",
builder.Configuration.AsEnumerable()
.Select(kv => $"{
kv.Key}: {
kv.Value}"));
Console.WriteLine(allConfigs);
**性能优化
减少高频访问的配置节深度
对不变配置使用IOptions<T>而非IOptionsSnapshot<T>
避免在配置键名中使用冒号(😃,会增加解析开销
**安全注意事项
永远不要将机密存储在版本控制的配置文件中
限制配置文件的读写权限
对从不可信源加载的配置进行验证
**自定义配置提供程序
实现IConfigurationSource和IConfigurationProvider:
public class CustomConfigSource : IConfigurationSource {
public IConfigurationProvider Build(IConfigurationBuilder builder)
=> new CustomConfigProvider();
}
services.AddSingleton<IConfigurationSource, CustomConfigSource>();
**配置架构设计建议
按功能模块划分配置节
为不同部署环境维护独立的顶层配置
对必填配置添加数据注解验证
为配置类添加XML注释生成配置文档

















暂无评论内容