0

0

ASP.NET Core中的配置提供程序是什么?如何自定义?

畫卷琴夢

畫卷琴夢

发布时间:2025-08-30 08:12:01

|

966人浏览过

|

来源于php中文网

原创

ASP.NET Core中通过实现IConfigurationProvider和IConfigurationSource接口创建自定义配置提供程序,如从数据库加载配置,并可在Load方法中处理错误、使用重试策略,结合IOptionsMonitor实现配置自动刷新,通过加密工具保护敏感数据,且支持多提供程序按注册顺序决定优先级。

asp.net core中的配置提供程序是什么?如何自定义?

ASP.NET Core中的配置提供程序负责从各种来源加载配置数据,并将其提供给应用程序使用。它们允许你从如appsettings.json、环境变量、命令行参数甚至自定义来源读取配置。自定义配置提供程序则意味着你可以编写自己的代码来加载配置,例如从数据库或加密文件中读取。

解决方案

ASP.NET Core使用

IConfigurationProvider
接口来抽象配置数据的来源。框架内置了多种配置提供程序,例如:

  • JsonConfigurationProvider
    : 从JSON文件(如appsettings.json)读取配置。
  • EnvironmentVariablesConfigurationProvider
    : 从环境变量读取配置。
  • CommandLineConfigurationProvider
    : 从命令行参数读取配置。
  • XmlConfigurationProvider
    : 从XML文件读取配置。
  • IniConfigurationProvider
    : 从INI文件读取配置。

要自定义配置提供程序,你需要:

  1. 创建一个类,实现
    IConfigurationProvider
    接口。
  2. 创建一个类,实现
    IConfigurationSource
    接口。
  3. ConfigureAppConfiguration
    方法中,使用
    IConfigurationBuilder
    注册你的自定义配置源。

下面是一个简单的示例,演示如何创建一个从数据库读取配置的自定义配置提供程序。

// 1. 定义配置源
public class DatabaseConfigurationSource : IConfigurationSource
{
    private readonly string _connectionString;

    public DatabaseConfigurationSource(string connectionString)
    {
        _connectionString = connectionString;
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new DatabaseConfigurationProvider(_connectionString);
    }
}

// 2. 定义配置提供程序
public class DatabaseConfigurationProvider : ConfigurationProvider
{
    private readonly string _connectionString;

    public DatabaseConfigurationProvider(string connectionString)
    {
        _connectionString = connectionString;
    }

    public override void Load()
    {
        // 模拟从数据库读取配置
        var data = new Dictionary(StringComparer.OrdinalIgnoreCase);
        // 假设有一个Config表,包含Key和Value两列
        // 这里直接硬编码模拟数据,实际情况需要连接数据库并读取
        data["Setting1"] = "ValueFromDatabase1";
        data["Setting2"] = "ValueFromDatabase2";

        Data = data;
    }
}

// 3. 定义扩展方法,方便注册配置源
public static class DatabaseConfigurationExtensions
{
    public static IConfigurationBuilder AddDatabaseConfiguration(this IConfigurationBuilder builder, string connectionString)
    {
        builder.Add(new DatabaseConfigurationSource(connectionString));
        return builder;
    }
}

// 4. 在Startup.cs (或 Program.cs in .NET 6+) 中注册配置源
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...
    }

    public void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder)
    {
        builder.AddDatabaseConfiguration("YourConnectionString"); // 替换为你的数据库连接字符串
    }
}

// 或者在.NET 6+ 中 Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddDatabaseConfiguration("YourConnectionString");

在这个例子中,

DatabaseConfigurationProvider
Load
方法负责从数据库读取配置数据,并将其存储在
Data
属性中。
Data
属性是一个
Dictionary
,其中键是配置键,值是配置值。

副标题1

如何处理配置提供程序中的错误?

处理配置提供程序中的错误至关重要,以防止应用程序在启动时崩溃或出现意外行为。 在

Load()
方法中,你需要捕获可能发生的异常,例如数据库连接错误或读取文件失败。 可以使用
try-catch
块来处理这些异常,并记录错误信息或抛出自定义异常。

public override void Load()
{
    try
    {
        // 模拟从数据库读取配置
        var data = new Dictionary(StringComparer.OrdinalIgnoreCase);
        // 假设有一个Config表,包含Key和Value两列
        // 这里直接硬编码模拟数据,实际情况需要连接数据库并读取
        // 实际情况需要连接数据库并读取
        data["Setting1"] = "ValueFromDatabase1";
        data["Setting2"] = "ValueFromDatabase2";

        Data = data;
    }
    catch (Exception ex)
    {
        // 记录错误信息
        Console.WriteLine($"Failed to load configuration from database: {ex.Message}");
        // 或者抛出自定义异常
        throw new ConfigurationException("Failed to load configuration from database.", ex);
    }
}

更进一步,你可以考虑使用重试策略来处理临时性错误,例如网络连接中断。 Polly 库提供了一种方便的方式来实现重试策略。

副标题2

如何实现配置的自动刷新?

谱乐AI
谱乐AI

谱乐AI,集成 Suno、Udio 等顶尖AI音乐模型的一站式AI音乐生成平台。

下载

ASP.NET Core 允许你在配置更改时自动刷新配置。 这对于需要在运行时更新配置而无需重启应用程序的场景非常有用。 要实现配置的自动刷新,你需要:

  1. 使用
    AddJsonFile
    或其他支持自动刷新的配置源。
  2. ConfigureServices
    方法中,将配置绑定到配置类,并使用
    IOptionsSnapshot
    IOptionsMonitor
    来访问配置。
// 1. 注册配置
public void ConfigureServices(IServiceCollection services)
{
    services.Configure(Configuration.GetSection("MyConfig"));
}

// 2. 使用IOptionsMonitor或IOptionsSnapshot
public class MyService
{
    private readonly IOptionsMonitor _configMonitor;

    public MyService(IOptionsMonitor configMonitor)
    {
        _configMonitor = configMonitor;
    }

    public void DoSomething()
    {
        // 获取最新的配置
        var config = _configMonitor.CurrentValue;
        Console.WriteLine($"Setting1: {config.Setting1}");
    }
}

// 定义配置类
public class MyConfig
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

IOptionsMonitor
提供了一种获取最新配置的方式,并且会在配置更改时自动通知你。
IOptionsSnapshot
则提供了一种获取配置快照的方式,该快照在请求期间保持不变。

副标题3

如何对配置进行加密和解密?

对配置进行加密可以保护敏感信息,例如数据库连接字符串或 API 密钥。 可以使用

DataProtectionProvider
或其他加密库来加密和解密配置。

using Microsoft.AspNetCore.DataProtection;
using System.Security.Cryptography;
using System.Text;

public static class EncryptionHelper
{
    public static string EncryptString(string plainText, string key)
    {
        byte[] iv = new byte[16];
        byte[] array;

        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = iv;

            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream))
                    {
                        streamWriter.Write(plainText);
                    }

                    array = memoryStream.ToArray();
                }
            }
        }

        return Convert.ToBase64String(array);
    }

    public static string DecryptString(string cipherText, string key)
    {
        byte[] iv = new byte[16];
        byte[] buffer = Convert.FromBase64String(cipherText);

        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = iv;
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

            using (MemoryStream memoryStream = new MemoryStream(buffer))
            {
                using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
                    {
                        return streamReader.ReadToEnd();
                    }
                }
            }
        }
    }
}


// 使用示例
string key = "YourSecretKey"; // 务必使用强密钥
string plainText = "SensitiveData";
string encryptedText = EncryptionHelper.EncryptString(plainText, key);
string decryptedText = EncryptionHelper.DecryptString(encryptedText, key);

Console.WriteLine($"Plain Text: {plainText}");
Console.WriteLine($"Encrypted Text: {encryptedText}");
Console.WriteLine($"Decrypted Text: {decryptedText}");

请注意,密钥管理至关重要。 不要将密钥存储在源代码或配置文件中。 可以使用 Azure Key Vault 或其他密钥管理服务来安全地存储和管理密钥。 同时,要确保密钥的安全性,避免泄露。

副标题4

如何使用多个配置提供程序并设置优先级?

ASP.NET Core 允许你使用多个配置提供程序,并设置它们的优先级。 配置提供程序的优先级决定了当多个提供程序包含相同配置键时,哪个提供程序的值将被使用。 配置提供程序按照它们添加到

IConfigurationBuilder
的顺序进行评估,后添加的提供程序具有更高的优先级。

public void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder)
{
    builder.Sources.Clear(); // 清除默认的配置源

    builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    builder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
    builder.AddEnvironmentVariables();
    builder.AddCommandLine(Environment.GetCommandLineArgs());
    builder.AddDatabaseConfiguration("YourConnectionString"); // 数据库配置优先级最高
}

在这个例子中,

DatabaseConfigurationProvider
具有最高的优先级,因为它最后被添加到
IConfigurationBuilder
。 这意味着如果数据库配置中包含与
appsettings.json
或环境变量中相同的配置键,则数据库配置的值将被使用。 可以根据实际需求调整配置提供程序的顺序,以设置不同的优先级。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1874

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

991

2024.11.28

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号