ASP Core中自定义IPAddress TypeConverter未生效,配置绑定失败
ASP.NET Core配置绑定IPAddress自定义转换器未触发的解决方案
核心问题
ASP.NET Core的配置绑定系统(Microsoft.Extensions.Configuration)默认不依赖TypeDescriptor注册的类型转换器,所以你通过TypeDescriptor.AddAttributes添加的IpAddressConverter不会被调用,导致IPAddress属性始终被设为默认值。
解决方案
方案一:使用System.Text.Json自定义转换器
配置绑定处理字符串转对象时,底层依赖System.Text.Json序列化,可通过实现JsonConverter<IPAddress>来处理IP地址转换:
- 实现IP地址Json转换器
public class IpAddressJsonConverter : JsonConverter<IPAddress> { public override IPAddress Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String && IPAddress.TryParse(reader.GetString(), out var ipAddress)) { return ipAddress; } // 转换失败可返回默认值或抛出异常 return IPAddress.None; } public override void Write(Utf8JsonWriter writer, IPAddress value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString()); } }
- 绑定配置时指定转换器
// 读取配置节点并绑定 var configSection = configurationRoot.GetSection(nameof(Configuration)); var appConfig = configSection.Get<Configuration>(options => { options.JsonSerializerOptions.Converters.Add(new IpAddressJsonConverter()); }); builder.Services.AddSingleton(appConfig);
方案二:使用配置系统专属类型转换器
ASP.NET Core配置系统提供IConfigurationConverter<T>接口,专门用于配置绑定的类型转换:
- 实现配置转换器
public class IpAddressConfigConverter : IConfigurationConverter<IPAddress> { public IPAddress Convert(object input) { if (input is string ipStr && IPAddress.TryParse(ipStr, out var ipAddress)) { return ipAddress; } // 转换失败可返回默认值或抛出异常 return IPAddress.None; } }
- 注册转换器到配置系统
// 注册自定义转换器 ConfigurationBinder.TypeConverters.Add(typeof(IPAddress), new IpAddressConfigConverter()); // 绑定配置 var appConfig = configurationRoot.GetSection(nameof(Configuration)).Get<Configuration>(); builder.Services.AddSingleton(appConfig);
额外注意事项
你的appsettings.json最后一个IP地址后多了一个逗号,属于语法错误,会导致配置加载异常,修正后如下:
{ "IpAddressConfig": { "HostAddress": "172.17.0.9", "Remote1Address": "192.56.0.9", "Remote2Address": "192.56.0.10" } }
内容的提问来源于stack exchange,提问作者quincy783
相关产品推荐
相关产品推荐

