ASP.NET Core 应用程序的启动与配置:Program.cs 文件的全面解析
ASP.NET Core 应用程序的启动与配置:Program.cs 文件的全面解析
Program.cs 是 ASP.NET Core 应用程序的入口点,负责应用程序的启动和配置。以下是 Program.cs 文件中完成的主要工作,按逻辑步骤进行总结:
1. 创建和配置主机环境
- 创建 WebApplication 构建器:
- 使用
WebApplication.CreateBuilder(args)创建一个WebApplicationBuilder实例,该实例用于配置应用程序的主机和服务。 - 自动加载配置文件(如
appsettings.json)和命令行参数,并设置日志记录、依赖注入等基础功能。
- 使用
2. 获取配置和环境对象
- 获取配置和环境信息:
- 通过
builder.Configuration获取应用程序的配置对象,可以从多个来源(如appsettings.json、环境变量等)读取配置。 - 通过
builder.Environment获取当前的运行环境(如开发、生产等),以便根据不同的环境配置中间件和行为。 - 创建并配置日志记录器,确保可以在
Program.cs中记录日志,使用控制台输出日志。
- 通过
3. 加载和验证应用程序设置
- 加载
AppSettings:- 从配置中加载
AppSettings配置节,并将其绑定到AppSettings类型的对象。 - 将
AppSettings注册到依赖注入容器中,以便后续可以注入到其他服务中。 - 记录一条调试日志,表明
AppSettings已成功加载。
- 从配置中加载
4. 配置 Application Insights
- 启用 Application Insights:
- 如果
AppSettings中启用了 Application Insights,则调用AddApplicationInsightsTelemetry()来配置和启用 Application Insights 监控。 - 记录一条跟踪日志,表明 Application Insights 已配置。
- 如果
5. 配置 API 版本控制
- 添加 API 版本控制:
- 使用
AddApiVersioning()配置 API 版本控制,确保 API 请求能够根据 URL 或请求头中的版本信息路由到正确的控制器和操作。 - 启用 API 版本报告,并设置默认版本为
1.0。 - 使用
AddVersionedApiExplorer()启用 API 版本探索功能,自动注册IApiVersionDescriptionProvider,以便在 Swagger 中显示不同版本的 API 文档。
- 使用
6. 配置 Swagger 和 API 文档
- 启用 Swagger:
- 如果
AppSettings中启用了 Swagger,则配置 Swagger 和 Swagger UI。 - 注册
ConfigureSwaggerOptions以自定义 Swagger 的生成选项。 - 通过
AddSwaggerGen()配置 Swagger 文档生成,包括从 XML 注释文件中提取注释。 - 确保每个 API 版本都有对应的 Swagger 文档端点,并在 Swagger UI 中显示。
- 如果
7. 配置依赖注入
- 注册业务服务和映射:
- 调用
ConfigureMappings()和ConfigureBusinessServices()方法,注册应用程序所需的业务服务和映射配置。 - 这些方法通常会配置数据访问层、业务逻辑层等服务,并将它们注册到依赖注入容器中。
- 调用
8. 构建应用程序
- 构建
WebApplication实例:- 调用
builder.Build()构建WebApplication实例,完成所有配置和服务的初始化。 app是WebApplication的实例,用于配置 HTTP 请求管道并启动应用程序。
- 调用
9. 配置 HTTP 请求管道
- 配置中间件:
- 根据当前环境配置不同的中间件:
- 开发环境:启用开发者异常页面,方便调试。
- 生产环境:启用自定义异常处理中间件,捕获未处理的异常并返回适当的错误响应;启用 HTTPS 重定向和 HSTS(HTTP 严格传输安全)。
- 配置常见的中间件,如
UseHttpsRedirection()、UseRouting()、UseAuthorization()和UseRequestLocalization(),确保请求正确路由和授权。 - 使用
UseEndpoints()配置终结点映射,将请求路由到控制器。
- 根据当前环境配置不同的中间件:
10. 配置 Swagger UI
- 启用 Swagger UI:
- 如果
AppSettings中启用了 Swagger,并且 API 版本控制已配置,则启用 Swagger UI。 - 通过
IApiVersionDescriptionProvider获取所有 API 版本的描述,并为每个版本配置相应的 Swagger 文档端点。 - 确保每个版本的 API 文档都能在 Swagger UI 中正确显示。
- 如果
11. 启动应用程序
- 启动 WebApplication:
- 最后,调用
app.Run()启动应用程序,使其开始监听传入的 HTTP 请求并处理它们。
- 最后,调用
总结
Program.cs 文件的主要职责是:
- 配置应用程序的主机和服务,包括加载配置、设置日志记录、启用监控(如 Application Insights)、配置 API 版本控制和 Swagger 文档。
- 构建 HTTP 请求管道,配置中间件以处理请求、路由、授权和异常处理。
- 启动应用程序,使其开始监听和处理 HTTP 请求。
通过这些步骤,Program.cs 确保了应用程序的正确初始化和运行,提供了良好的开发和生产环境支持。
Program.cs解释如下
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.IO;
using System.Linq;
using System.Reflection;// 创建 WebApplication 构建器,它会读取命令行参数并初始化主机环境。
var builder = WebApplication.CreateBuilder(args);// 获取应用程序的配置对象(Configuration)和环境对象(Environment)
// 这些是 ASP.NET Core 应用程序的基础组件,用于访问配置文件和环境信息。
var configuration = builder.Configuration;
var env = builder.Environment;// 使用构建的服务提供者提前创建日志记录器实例。
// 这样可以在 Program.cs 中使用日志记录功能,而不需要依赖 Startup 类。
var serviceProvider = builder.Services.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();// 从配置中获取 AppSettings 配置节。
// AppSettings 是应用程序的主要配置部分,通常包含应用程序的运行时设置。
var appsettingsConfigurationSection = configuration.GetSection(nameof(AppSettings));// 如果没有找到 AppSettings 配置节,则抛出异常,确保应用程序不会在缺少关键配置的情况下启动。
if (appsettingsConfigurationSection == null)throw new Exception("No appsettings has been found");// 将 AppSettings 配置节绑定到 AppSettings 类型的对象,并注册到依赖注入容器中。
// 这使得 AppSettings 可以通过依赖注入在应用程序的其他部分使用。
var appSettings = appsettingsConfigurationSection.Get<AppSettings>();
builder.Services.Configure<AppSettings>(appsettingsConfigurationSection);
logger.LogDebug("AppSettings loaded for DI"); // 记录日志,表明 AppSettings 已加载到依赖注入容器中。// 从配置中获取 ApplicationInsights 配置节,并检查是否启用了 Application Insights。
// Application Insights 是一个应用性能管理服务,用于监控应用程序的性能和使用情况。
var applicationInsightsConfiturationSection = configuration.GetSection(nameof(ApplicationInsights));
if (applicationInsightsConfiturationSection != null && applicationInsightsConfiturationSection.Get<ApplicationInsights>().Enabled)
{// 如果启用了 Application Insights,则添加 Application Insights 的遥测服务。// 这将使应用程序能够发送遥测数据到 Azure Monitor。builder.Services.AddApplicationInsightsTelemetry();logger.LogTrace("Configuring Application Insights"); // 记录日志,表明正在配置 Application Insights。
}try
{if (appSettings.IsValid()){logger.LogDebug("Valid AppSettings"); // 记录日志,表明 AppSettings 有效。// 添加 MVC 控制器支持,并设置默认返回的内容类型为 JSON。// ProducesAttribute 确保所有控制器操作默认返回 JSON 格式的数据。builder.Services.AddControllers(opt =>{opt.Filters.Add(new ProducesAttribute("application/json"));}).SetCompatibilityVersion(CompatibilityVersion.Latest);// 添加 API 版本控制支持,设置默认版本为 1.0,并启用 URL 段读取版本号。// 这允许应用程序根据 URL 中的版本号来区分不同的 API 版本。builder.Services.AddApiVersioning(o =>{o.ReportApiVersions = true;o.AssumeDefaultVersionWhenUnspecified = true;o.DefaultApiVersion = new ApiVersion(1, 0);o.ApiVersionReader = new UrlSegmentApiVersionReader();});// 添加 API 版本探索支持,以便 Swagger 可以显示不同版本的 API。// GroupNameFormat 设置了 API 版本的命名格式,SubstituteApiVersionInUrl 确保版本号出现在 URL 中。builder.Services.AddVersionedApiExplorer(options =>{options.GroupNameFormat = "'v'VVV";options.SubstituteApiVersionInUrl = true;});// 如果启用了 Swagger,则配置 Swagger 和 Swagger UI。// Swagger 是一个工具,用于生成和展示 API 文档。if (appSettings.Swagger.Enabled){// 注册 Swagger 选项配置类,用于自定义 Swagger 的行为。builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();// 配置 Swagger 生成器,包括操作过滤器和 XML 文档注释。// XML 文档注释提供了 API 方法的详细说明,帮助开发者更好地理解 API。builder.Services.AddSwaggerGen(options =>{options.OperationFilter<SwaggerDefaultValues>();// 获取当前程序集及其引用的所有程序集。var allAssemblies = new[] { Assembly.GetExecutingAssembly() }.Union(Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(a => Assembly.Load(a)));// 遍历所有程序集,查找并包含对应的 XML 文档注释文件。foreach (var assembly in allAssemblies){var xmlFile = $"{assembly.GetName().Name}.xml";var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);if (File.Exists(xmlPath)){options.IncludeXmlComments(xmlPath);}}});}// 注册映射和业务服务配置。// 这些配置可能包括 AutoMapper 映射、数据库上下文、服务注册等。builder.Services.ConfigureMappings();builder.Services.ConfigureBusinessServices(configuration);logger.LogDebug("ApiVersioning, Swagger and DI settings configured"); // 记录日志,表明 API 版本控制、Swagger 和依赖注入已配置完成。}else{logger.LogDebug("Invalid AppSettings"); // 记录日志,表明 AppSettings 无效。}
}
catch (Exception ex)
{// 捕获配置过程中可能出现的任何异常,并记录错误信息。// 这有助于在应用程序启动失败时进行调试。logger.LogError(ex.Message);
}// 构建 WebApplication 实例,准备启动应用程序。
var app = builder.Build();// 配置 HTTP 请求管道,根据环境选择不同的中间件。
logger.LogTrace("Configuring HTTP request pipeline"); // 记录日志,表明开始配置 HTTP 请求管道。
logger.LogDebug($"Environment: {env.EnvironmentName}"); // 记录当前环境名称。try
{if (env.IsDevelopment()){// 在开发环境中,使用开发者异常页面,提供更详细的错误信息。// 开发者异常页面会显示完整的堆栈跟踪,帮助开发者快速定位问题。app.UseDeveloperExceptionPage();logger.LogInformation("Developer exception page loaded."); // 记录日志,表明开发者异常页面已加载。}else{// 在生产环境中,使用自定义的异常处理中间件,并启用 HSTS(HTTP 严格传输安全)。// 自定义异常处理中间件捕获未处理的异常,并返回友好的错误响应。app.UseExceptionHandler(a => a.Run(async context =>{var feature = context.Features.Get<IExceptionHandlerPathFeature>();var exception = feature.Error;var code = HttpStatusCode.InternalServerError;// 根据异常类型设置适当的 HTTP 状态码。if (exception is ArgumentNullException) code = HttpStatusCode.BadRequest;else if (exception is ArgumentException) code = HttpStatusCode.BadRequest;else if (exception is UnauthorizedAccessException) code = HttpStatusCode.Unauthorized;// 记录全局错误处理器捕获的异常信息。logger.LogError($"GLOBAL ERROR HANDLER::HTTP:{code}::{exception.Message}");// 使用 Newtonsoft.Json 序列化异常信息,并将其作为 JSON 响应返回给客户端。var result = Newtonsoft.Json.JsonConvert.SerializeObject(exception, Newtonsoft.Json.Formatting.Indented);context.Response.Clear();context.Response.ContentType = "application/json";await context.Response.WriteAsync(result);}));// 启用 HSTS,强制浏览器只通过 HTTPS 访问应用程序。app.UseHsts();}// 使用 HTTPS 重定向中间件,强制所有请求通过 HTTPS。// 这确保了即使用户通过 HTTP 访问,也会被自动重定向到 HTTPS。app.UseHttpsRedirection();// 使用路由中间件,解析 URL 并分发到相应的控制器或处理器。// 路由中间件负责将传入的 HTTP 请求映射到正确的控制器和操作。app.UseRouting();// 使用授权中间件,执行身份验证和授权逻辑。// 授权中间件确保只有经过身份验证和授权的用户才能访问受保护的资源。app.UseAuthorization();// 使用请求本地化中间件,设置应用程序的区域性。// 请求本地化中间件可以根据用户的语言和文化设置来调整应用程序的行为。app.UseRequestLocalization();// 使用终结点中间件,映射控制器路由。// 终结点中间件负责实际处理 HTTP 请求并将响应返回给客户端。app.UseEndpoints(endpoints =>{endpoints.MapControllers();});// 如果启用了 Swagger,则配置 Swagger UI。// Swagger UI 提供了一个交互式的界面,开发者可以通过它浏览和测试 API。if (appSettings.IsValid() && appSettings.Swagger.Enabled){// 使用 Swagger 中间件,提供 API 文档。app.UseSwagger();// 使用 Swagger UI 中间件,提供交互式的 API 文档界面。app.UseSwaggerUI(options =>{// 获取 API 版本描述提供者,用于生成不同版本的 Swagger 文档。var provider = app.ServiceProvider.GetRequiredService<IApiVersionDescriptionProvider>();// 为每个 API 版本添加 Swagger 端点。foreach (var description in provider.ApiVersionDescriptions){options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());}});}
}
catch (Exception ex)
{// 捕获配置 HTTP 请求管道过程中可能出现的任何异常,并记录错误信息。// 这有助于在应用程序启动失败时进行调试。logger.LogError(ex.Message);
}// 启动应用程序,开始监听传入的 HTTP 请求。
// 一旦应用程序启动,它将开始处理来自客户端的 HTTP 请求。
app.Run();
逐行解释
-
引入命名空间:这些命名空间包含了 ASP.NET Core 所需的各种类和接口,例如
WebApplication、IConfiguration、ILogger等。 -
创建 WebApplication 构建器:
WebApplication.CreateBuilder(args)是 .NET 6+ 推荐的方式,用于创建和配置应用程序的主机环境。它会自动加载配置文件(如appsettings.json)、设置日志记录等。 -
获取配置和环境对象:
configuration和env是 ASP.NET Core 应用程序的基础组件,分别用于访问配置文件和环境信息。configuration用于读取应用程序的配置,env用于确定当前的运行环境(如开发、生产等)。 -
创建日志记录器实例:我们使用
builder.Services.BuildServiceProvider()提前创建IServiceProvider,从而可以在Program.cs中获取ILogger<Program>实例。这与你在Startup构造函数中获取ILogger<Startup>的方式一致。 -
加载 AppSettings 配置节:从配置文件中获取
AppSettings配置节,并检查其是否存在。如果不存在,则抛出异常,确保应用程序不会在缺少关键配置的情况下启动。 -
注册 AppSettings 到依赖注入容器:将
AppSettings配置节绑定到AppSettings类型的对象,并注册到依赖注入容器中。这样可以在应用程序的其他部分通过依赖注入使用AppSettings。 -
配置 Application Insights:从配置文件中获取
ApplicationInsights配置节,并检查是否启用了 Application Insights。如果启用了,则添加 Application Insights 的遥测服务,使应用程序能够发送遥测数据到 Azure Monitor。 -
检查 AppSettings 是否有效:如果
AppSettings有效,则继续配置其他服务;否则,记录日志并跳过后续配置。 -
添加 MVC 控制器支持:配置 MVC 控制器,设置默认返回的内容类型为 JSON。
ProducesAttribute确保所有控制器操作默认返回 JSON 格式的数据。 -
添加 API 版本控制支持:配置 API 版本控制,设置默认版本为 1.0,并启用 URL 段读取版本号。这允许应用程序根据 URL 中的版本号来区分不同的 API 版本。
-
添加 API 版本探索支持:配置 API 版本探索,以便 Swagger 可以显示不同版本的 API。
GroupNameFormat设置了 API 版本的命名格式,SubstituteApiVersionInUrl确保版本号出现在 URL 中。 -
配置 Swagger:如果启用了 Swagger
相关文章:
ASP.NET Core 应用程序的启动与配置:Program.cs 文件的全面解析
ASP.NET Core 应用程序的启动与配置:Program.cs 文件的全面解析 Program.cs 是 ASP.NET Core 应用程序的入口点,负责应用程序的启动和配置。以下是 Program.cs 文件中完成的主要工作,按逻辑步骤进行总结: 1. 创建和配置主机环境…...
2020-12-02 数字过滤
缘由 C语言 数组:数字过滤-CSDN问答 void chuli(int n15236) {int aa[47]{0},j0,m0;while(n)aa[j]n%10,n/10;while(j)if(aa[--j]%2)m*10,maa[j];cout << m << ends; } void 数字过滤(int n 15236) {int aa[47]{0}, j 0, m 0;while (…...
长短期记忆神经网络(LSTM)介绍
1、应用现状 长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问题,导致无法处理较长序列数据,从而无…...
数据结构 ——二叉树转广义表
数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树,转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根(左子树)(右子树)) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…...
chattts生成的音频与字幕修改完善,每段字幕对应不同颜色的视频,准备下一步插入视频。
上一节中,实现了先生成一个固定背景的与音频长度一致的视频,然后插入字幕。再合并成一个视频的方法。 但是:这样有点单了,所以: 1.根据字幕的长度先生成视频片断 2.在片段上加上字幕。 3.合并所有片断,…...
数据结构开始——时间复杂度和空间复杂度知识点笔记总结
好了,经过了漫长的时间学习c语言语法知识,现在我们到了数据结构的学习。 首先,我们得思考一下 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素…...
路由策略与策略路由
路由策略 常用有Router-Policy,Filter-Policy等 控制路由是否可达,通过修改路由条目相关参数影响流量的转发 基于控制平面,会影响路由表表项,但只能基于目地址进行策略判定,于路由协议相结合使用 Router-Policy …...
pytorch_fid 安装笔记
目录 torch安装: pytorch_fid安装 torch安装: pip install torch2.5.0 --index-url https://download.pytorch.org/whl/cu121 pytorch_fid安装 pip install pytorch_fid 安装后,torch也会自动安装,导致torch引用报错。...
Qt绘制仪表————附带详细说明和代码示例
文章目录 1 效果2 原理3 编码实践3.1 创建仪表属性类3.2 设置类属性3.3 绘制图案3.3.1 设置反走样3.3.2 绘制背景3.3.3 重新定义坐标原点3.3.4 绘制圆环3.3.5 绘制刻度线3.3.6 绘制刻度线上的描述值3.3.7 绘制指针3.3.8 绘制指针数值和单位3.3.9 控制指针变化 扩展福利参考 1 效…...
百度地图JavaScript API核心功能指引
百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富、交互性强的地图应用,包含了构建地图基本功能的各种接口,提供了诸如本地搜索、路线规划等数据服务。百度地图JavaScript API支持HTTP和HT…...
mp4影像和m4a音频无损合成视频方法
第一步:复制高清视频地址 url 第二步:打开网址粘贴复制的视频url视频下载 第三步:下载-影像.mp4和-音频.m4a 第四步:合并视频; 使用ffmpeg进行无损合成(如果没有安装ffmpeg请自行下载安装下载 FFmpeg (p2hp.com)&…...
Ubuntu下将Julia嵌入Jupyter内核
一.安装 Julia 如果 Julia 尚未安装: 打开终端,下载最新的 Julia 安装包: wget https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz 解压并移动到 /opt: tar -xvzf julia-1.9.3-linux-x86_…...
openGauss开源数据库实战二十五
文章目录 任务二十五 openGauss 数据库的物理备份与恢复任务目标实施步骤一、为进行物理备份做准备1.确保数据库工作在归档模式2.创建保存数据库物理备份的目录3.创建保存归档日志备份的目录 二、进行openGauss数据库的物理备份1.备份数据库2.切换WAL3.备份归档日志 三、openGa…...
[C/C++] List相关操作
List相关操作 1 链表二分 目标: (1)对于偶数节点,正好对半分; (2)对于奇数节点,前 后 1 (3)断开链表,方便后期合并 // 使用快慢指针完成中点…...
继电器控制与C++编程:实现安全开关控制的技术分享
在现代生活中,继电器作为一种重要的电气控制元件,在电气设备的安全控制中起到了至关重要的作用。通过低电流控制高电流,继电器能够有效地隔离控制电路与被控设备,从而保障使用者的安全。本项目将介绍如何通过树莓派Pico与继电器模块结合,使用C++编程实现继电器的控制。 一…...
题解 - 找子序列(2024.12上海月赛丙组T4)
题目描述 Dave 有一个长度为 n 的非负整数序列 a1-n, 和一个非负整数 m 。 他希望知道是否有一个 a 的非空子序列,使得子序列中所有元素的按位与(bitwise AND)结果为 m。 换言之,他想知道是否存在一个下标序列 i1-k(k ≥ 1),满足 1 ≤ i1 < i2 < …...
在centos 7.9上面安装mingw交叉编译工具
1.说明 为了在centos上面编译windows的程序,需要安装mingw工具,mingw工具是可以编译windows程序的一些工具链,使用方式和linux一致 2.下载脚本 使用脚本方式编译,github的脚本位置:https://github.com/Zeranoe/ming…...
ubuntu wine mobaxterm找不到串口和解决方案
安装好 打开MobaXterm时发现,没有可供选择的串口 我们再检查wine设备映射 ls -la ~/.wine/dosdevices/ 串口是存在的,我们再来一番神操作,并没有回滚操作,不知是否是必要修改 打开 注册表,在HKEY_LOCAL_MACHINE中的…...
如何编译安装系统settings设置应用(5.0.0-Release)
本文介绍如何在OpenHarmony 5.0.0 r版本中修改系统设置应用,并且编译安装到开发板上 开发环境 1.dayu200开发板 2.OpenHarmony 5.0.0r 固件 3.API12 full sdk (如果安装full sdk过程中出现报错hvigor ERROR: Cannot find module typescript,请参考 h…...
<项目代码>YOLOv8 车牌识别<目标检测>
项目代码下载链接 <项目代码>YOLOv8 车牌识别<目标检测>https://download.csdn.net/download/qq_53332949/90121387YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
