從 .NET 11 開始,使用 AddConfiguration 新增的設定會將空字串視為已提供的值。 因此,空字串會覆蓋外部配置中較早註冊的提供者的值,而非讓那些較早的值保持有效。
此變更延續了 .NET 10 中由 null所建立的空值與 組態值之間的區分。 鏈式配置對 null 的處理方式未變。
所推出的版本
.NET 11 RC 1
以前的行為
ChainedConfigurationProvider.TryGet 回報找不到空字串。 因此,鏈式配置中的空值未覆蓋先前提供者提供的值:
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
IConfiguration inner = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>
{
["Endpoint"] = "",
})
.Build();
IConfiguration configuration = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string?>
{
["Endpoint"] = "https://example.com",
})
.AddConfiguration(inner)
.Build();
Console.WriteLine($"Endpoint: '{configuration["Endpoint"]}'");
在 .NET 11 之前,輸出為:
Endpoint: 'https://example.com'
當沒有先前的值時,讀取該金鑰回傳 null,且唯一值為串接空字串的區段被視為不存在。
新行為
從 .NET 11 開始,會ChainedConfigurationProvider.TryGet將空字串視為已找到。 在前述範例中,空 inner 值會覆蓋先前的值,輸出為:
Endpoint: ''
若某區段的值為空字串,則視為存在。 綁定也會觀察空值,而非先前提供者的值。 例如,將空字串繫結至先前為數值的整數屬性,會擲回 InvalidOperationException,這與直接新增的提供者所提供的空值一致。
在包裝的 IConfiguration 中,null 值仍被視為缺失,因為 IConfiguration 索引器無法區分值為 null 的鍵與缺少的鍵。
破壞性變更的類型
此變更為行為變更。
變更原因
空字串即為有效的設定值。 將該設定視為缺失,使鏈式設定與直接新增的設定提供者不一致,並防止應用程式透過用空字串覆蓋該設定來故意清除或停用該設定。 新行為保留了配置提供者對空值與缺失值的區分。 更多資訊請參見 dotnet/runtime#131480。
建議的動作
若空字串意圖覆蓋先前的值,則無需操作。
如果你的應用程式在鏈式配置中依賴空字串,讓先前提供者的值勝出,請將該金鑰從鏈式配置中移除,或表示為缺少或 null。 將鏈結值綁定於非字串型別的應用程式,也應在綁定前驗證或正規化空值,若空值對目標型別無效。 沒有相容開關可以恢復之前的行為。