我正在将用 .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 检索该值。 为什么现在这不起作用? [[]()]()
我已经尝试过 https://www.nuget.org/packages/System.Configuration.ConfigurationManager/ 包,但它没有按预期工作。
根据我自己的理解,
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();
}
测试结果
禁用配置桥
启用配置桥