You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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地址转换:

  1. 实现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());
    }
}
  1. 绑定配置时指定转换器
// 读取配置节点并绑定
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>接口,专门用于配置绑定的类型转换:

  1. 实现配置转换器
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;
    }
}
  1. 注册转换器到配置系统
// 注册自定义转换器
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:22:43