其他基本功能
launchSettings.json
launchSettings.json 是 ASP.NET Core 应用程序中的一个配置文件,用于配置开发环境中的启动设置。
它包含应用程序如何在本地运行的相关信息,例如使用的环境变量、运行配置、端口、命令行参数等。通常它位于项目的 Properties 文件夹中。
一个典型的 launchSettings.json
文件的结构如下:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:31988",
"sslPort": 44385
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "http://localhost:9000/swagger/index.html",
"applicationUrl": "http://localhost:9000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
//"applicationUrl": "https://localhost:9000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
其中:
IIS Express
配置:
- windowsAuthentication: 设置是否启用 Windows 身份验证。这里设置为 false,即不启用 Windows 身份验证。
- anonymousAuthentication: 设置是否启用匿名身份验证。设置为 true,即启用匿名身份验证。
- iisExpress: 配置 IIS Express 的设置。
- applicationUrl: 设置应用在 IIS Express 下运行时的 URL,http://localhost:31988。
- sslPort: 设置 SSL 端口为 44385,用于支持 HTTPS 连接。
- profiles(不同启动配置的集合,提供了多种方式来运行和调试 ASP.NET Core 应用)
http
- commandName: 设置为 Project,表示直接通过 dotnet run 启动应用(而不是通过 IIS Express)。
- dotnetRunMessages: 设置为 true,表示启用 dotnet run 时的输出消息,帮助调试时看到更多信息。
- launchBrowser: 设置为 true,表示启动浏览器。此选项在本地开发时很常用,能够自动打开浏览器访问应用。
- launchUrl: 设置为 http://localhost:9000/swagger/index.html 表示浏览器启动后会自动打开 Swagger 文档页面。
- applicationUrl: 设置为 http://localhost:9000,表示应用在本地运行时监听的 URL。
- environmentVariables: 设置环境变量 ASPNETCORE_ENVIRONMENT 为 Development,确保在开发环境中运行。
https
- commandName: 同样是 Project,表示直接通过 dotnet run 启动应用。
- dotnetRunMessages: 启用 dotnet run 输出消息,帮助调试。
- launchBrowser: 启动浏览器,默认打开应用。
- applicationUrl: 这行被注释掉了,但如果取消注释,将指定应用的 URL 为 https://localhost:9000,支持 HTTPS。
- environmentVariables: 设置 ASPNETCORE_ENVIRONMENT 为 Development,运行在开发环境中。
IIS Express
- commandName: 设置为 IISExpress,表示使用 IIS Express 启动应用。
- launchBrowser: 设置为 true,表示启动浏览器并访问应用。
- environmentVariables: 设置环境变量 ASPNETCORE_ENVIRONMENT 为 Development,确保应用在开发环境中运行。
提示
使用 Visual Studio 运行项目,launchSettings.json 配置将会被使用,以确定如何启动应用。
在通过命令行运行项目时,launchSettings.json 中的配置不会直接生效,可以使用 dotnet run
命令时指定环境变量来模拟相应的设置。
Native AOT(Ahead-of-Time Compilation)
Native AOT(Ahead-of-Time Compilation)是 .NET 6 引入的一种新特性,
旨在将 .NET 应用程序编译为本机代码(native code),以提高启动速度和运行时性能。
这一特性尤其适合于需要快速启动和低内存占用的应用场景,如微服务、命令行工具和服务器应用。
主要特点
- 提前编译:
Native AOT 允许将应用程序的所有代码在构建时编译为本机代码,而不是在运行时使用 JIT(Just-In-Time)编译。这可以显著提高应用的启动速度。
- 减少内存占用:
由于省去了运行时所需的 JIT 编译和其他相关开销,Native AOT 应用程序的内存占用通常会更低。
- 独立于运行时:
Native AOT 编译的应用程序可以在没有完整 .NET 运行时的环境中运行,这使得在某些限制条件下(如嵌入式设备或容器)更加灵活。
- 快速启动时间:
由于应用程序已被编译为本机代码,启动时间显著减少,适合用于微服务架构和云原生应用。
- 安全性:
由于代码在编译时已经被转换为本机代码,攻击面相对较小,减少了某些类型的运行时攻击(如 JIT 相关的攻击)。
使用 Native AOT
要使用 Native AOT 编译 .NET 应用程序,可以在MSBuild property中启用相关设置。
日志(Logging)
.NET Core
提供了一个灵活的日志框架,可以记录不同类型的日志信息,支持多种日志输出方式(控制台、文件、数据库、远程服务器等)。
日志系统主要通过 ILogger
接口进行操作。
- 概述
.NET Core
使用 Microsoft.Extensions.Logging
提供的日志框架来进行日志记录。你可以通过注入 ILogger
来记录不同级别的日志。
常见的日志级别有:
Trace
: 最详细的日志信息,通常用于调试。Debug
: 仅在调试阶段使用的日志,用于开发人员诊断。Information
: 主要用于正常的应用程序流程信息,例如请求和响应。Warning
: 表示潜在的问题或即将发生的错误,通常是可以恢复的情况。Error
: 记录错误事件,通常意味着出现了问题,但不会导致应用崩溃。Critical
: 表示系统级的严重错误,可能导致应用崩溃或服务不可用。None
: 禁用日志记录。
日志级别可以控制日志的输出细节和量。
大多数日志系统都可以配置输出级别阈值,从而控制最低输出的日志级别。
例如,如果设置日志输出级别为Warning
,那么低于 Warning
的 Information
、Debug
、Trace
级别的日志都不会输出,减少日志量。
- 配置
在 .NET 6
及更高版本中,日志配置通常在 Program.cs
中进行。
示例代码:
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder();
// 添加控制台日志
builder.Logging.AddConsole();
}
}
- 使用
你可以通过注入 ILogger<T>
来记录日志:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation("Index page visited.");
return View();
}
public IActionResult Error()
{
_logger.LogError("An error occurred.");
return View();
}
}
- 日志存储
.NET Core
默认提供了多个日志存储方式,常见的包括:
- 控制台:输出到控制台窗口。
- 文件:通过第三方库(如 Serilog、NLog、log4net 等)将日志输出到文件和数据库。
- 调试输出:输出到调试窗口。
以 Serilog
为例:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, logging) =>
{
logging.AddSerilog(new LoggerConfiguration()
.WriteTo.File("Logs/log.txt")
.CreateLogger());
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
测试(Test)
Http 请求(Make Http Request)
示例:
using System.Text.Json;
using System.Text;
namespace WebApplicationDemo.Other.MakeHttpRequest
{
public class CustomHttpService
{
private readonly HttpClient _httpClient;
public CustomHttpService(HttpClient httpClient)
{
_httpClient = httpClient;
_httpClient.BaseAddress = new Uri("http://127.0.0.1:9000/api/");
//_httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer your_token_here");
}
public async Task<string> GetDataAsync()
{
var response = await _httpClient.GetAsync("CustomTarget");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> GetDataAsync(int id)
{
var response = await _httpClient.GetAsync("CustomTarget" + id);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> PostDataAsync(object data)
{
var jsonData = JsonSerializer.Serialize(data);
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("CustomTarget", content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> PutDataAsync(int id, object data)
{
var jsonData = JsonSerializer.Serialize(data);
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
var response = await _httpClient.PutAsync($"CustomTarget/{id}", content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> DeleteDataAsync(int id)
{
var response = await _httpClient.DeleteAsync($"CustomTarget/{id}");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
}