Skip to content

其他基本功能

launchSettings.json

launchSettings.json 是 ASP.NET Core 应用程序中的一个配置文件,用于配置开发环境中的启动设置。

它包含应用程序如何在本地运行的相关信息,例如使用的环境变量、运行配置、端口、命令行参数等。通常它位于项目的 Properties 文件夹中。

一个典型的 launchSettings.json 文件的结构如下:

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"
      }
    }
  }
}

其中:

  1. IIS Express 配置
  • windowsAuthentication: 设置是否启用 Windows 身份验证。这里设置为 false,即不启用 Windows 身份验证。
  • anonymousAuthentication: 设置是否启用匿名身份验证。设置为 true,即启用匿名身份验证。
  • iisExpress: 配置 IIS Express 的设置。
    • applicationUrl: 设置应用在 IIS Express 下运行时的 URL,http://localhost:31988
    • sslPort: 设置 SSL 端口为 44385,用于支持 HTTPS 连接。
  1. 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 接口进行操作。

  1. 概述

.NET Core 使用 Microsoft.Extensions.Logging 提供的日志框架来进行日志记录。你可以通过注入 ILogger 来记录不同级别的日志。

常见的日志级别有:

  • Trace: 最详细的日志信息,通常用于调试。
  • Debug: 仅在调试阶段使用的日志,用于开发人员诊断。
  • Information: 主要用于正常的应用程序流程信息,例如请求和响应。
  • Warning: 表示潜在的问题或即将发生的错误,通常是可以恢复的情况。
  • Error: 记录错误事件,通常意味着出现了问题,但不会导致应用崩溃。
  • Critical: 表示系统级的严重错误,可能导致应用崩溃或服务不可用。
  • None: 禁用日志记录。

日志级别可以控制日志的输出细节和量。

大多数日志系统都可以配置输出级别阈值,从而控制最低输出的日志级别。

例如,如果设置日志输出级别为Warning,那么低于 WarningInformationDebugTrace 级别的日志都不会输出,减少日志量。

  1. 配置

.NET 6 及更高版本中,日志配置通常在 Program.cs 中进行。

示例代码:

C#
public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder();

        // 添加控制台日志
        builder.Logging.AddConsole();
    }

}
  1. 使用

你可以通过注入 ILogger<T> 来记录日志:

C#
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();
    }
}
  1. 日志存储 .NET Core 默认提供了多个日志存储方式,常见的包括:
  • 控制台:输出到控制台窗口。
  • 文件:通过第三方库(如 Serilog、NLog、log4net 等)将日志输出到文件和数据库。
  • 调试输出:输出到调试窗口。

Serilog 为例:

C#
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)

示例:

C#
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();
        }
    }
}

Document Base on VitePress.