在鏈式組態中,空字串會覆蓋先前的提供者

從 .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。 將鏈結值綁定於非字串型別的應用程式,也應在綁定前驗證或正規化空值,若空值對目標型別無效。 沒有相容開關可以恢復之前的行為。

受影響的 API