.Net8 和 System.Configuration.ConfigurationManager.AppSettings 忽略 Azure AppService 配置

问题描述 投票:0回答:1

我正在将用 .NET Framework 4.8 编写的应用程序迁移到 .NET 8。 这些应用程序托管在 Azure 应用服务上。我们在部署过程中大量利用 Azure DevOps。 我们的应用程序使用 System.ConfigurationManager.AppSettings 来读取配置值。 在.NET 8中,有IConfiguration对象可用。我真的不想迁移到这种读取配置的方式,因为它会涉及重大代码更改并影响我们的许多 NuGet 包。 在 .NET 8 中,有一个名为 System.Configuration.ConfigurationManager 的 NuGet 包可用。问题是 System.Configuration.ConfigurationManager.AppSettings 看不到 Azure AppService 配置中的值,只能看到 app.config 文件中 AppSettings 中的值。 在 .NET Framework 中,如果 app.config 文件的 AppSettings 部分中的键与 Azure 应用服务配置中的键相同,则将从 Azure 检索该值。 为什么现在这不起作用? [[enter image description here](https://i.stack.imgur.com/nf6x6.png)](https://i.stack.imgur.com/gSey7.png)

我已经尝试过 https://www.nuget.org/packages/System.Configuration.ConfigurationManager/ 包,但它没有按预期工作。

azure asp.net-core migration .net-8.0 appservice
1个回答
0
投票

根据我自己的理解,

System.Configuration.ConfigurationManager
.net core
存在的主要意义应该是兼容
.net framework
,这样在迁移的时候可以更方便。

对于

Azure App Service
.NET framework
使用
System.Configuration.ConfigurationManager
.NET core
使用
IConfiguration
,旨在读取基于标准框架的配置。

要实现也可以使用

System.Configuration.ConfigurationManager
来读取配置,我们需要创建一个自定义
ConfigurationBridge
来桥接它。

配置桥.cs

using Newtonsoft.Json.Linq;

namespace TestAppService
{
    public class ConfigurationBridge
    {
        public static void LoadConfiguration()
        {
            LoadAppSettingsFromJson("appsettings.json");
            LoadAzureAppServiceSettings();
        }

        private static void LoadAppSettingsFromJson(string filePath)
        {
            if (!File.Exists(filePath)) return;

            var json = File.ReadAllText(filePath);
            var jsonObject = JObject.Parse(json);

            foreach (var prop in jsonObject.Properties()) 
            {
                var key = prop.Name;
                var value = prop.Value.ToString();
                System.Configuration.ConfigurationManager.AppSettings.Set(key, value);
            }
        }


        private static void LoadAzureAppServiceSettings()
        {
            foreach (var key in Environment.GetEnvironmentVariables().Keys)
            {
                var value = Environment.GetEnvironmentVariable(key.ToString());
                System.Configuration.ConfigurationManager.AppSettings.Set(key.ToString(), value);
            }
        }
    }
}

在Program.cs中注册

在控制器中使用

public IActionResult Index()
{
    ViewBag.TestKey = System.Configuration.ConfigurationManager.AppSettings["testkey"];
    //_configuration["TestKey"];
    return View();
}

测试结果

禁用配置桥

启用配置桥

© www.soinside.com 2019 - 2024. All rights reserved.