Asp.Net Core 基于(asp.net core 2.2) 创建asp .net core空项目

文章目录

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 ExpressProject)。

(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>

避免在配置键名中使用冒号(😃,会增加解析开销

**安全注意事项

永远不要将机密存储在版本控制的配置文件中

限制配置文件的读写权限

对从不可信源加载的配置进行验证

**自定义配置提供程序

实现IConfigurationSourceIConfigurationProvider:

public class CustomConfigSource : IConfigurationSource {
            
    public IConfigurationProvider Build(IConfigurationBuilder builder) 
        => new CustomConfigProvider();
}

services.AddSingleton<IConfigurationSource, CustomConfigSource>();

**配置架构设计建议

按功能模块划分配置节

为不同部署环境维护独立的顶层配置

对必填配置添加数据注解验证

为配置类添加XML注释生成配置文档

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容