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

畫卷琴夢
发布: 2025-08-30 08:12:01
原创
950人浏览过
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<string, string>(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<string, string>
登录后复制
,其中键是配置键,值是配置值。

副标题1

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

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

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

public override void Load()
{
    try
    {
        // 模拟从数据库读取配置
        var data = new Dictionary<string, string>(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

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

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中22
查看详情 百度文心百中

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

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

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

    public MyService(IOptionsMonitor<MyConfig> 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<T>
登录后复制
提供了一种获取最新配置的方式,并且会在配置更改时自动通知你。
IOptionsSnapshot<T>
登录后复制
则提供了一种获取配置快照的方式,该快照在请求期间保持不变。

副标题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
登录后复制
或环境变量中相同的配置键,则数据库配置的值将被使用。 可以根据实际需求调整配置提供程序的顺序,以设置不同的优先级。

以上就是ASP.NET Core中的配置提供程序是什么?如何自定义?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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