.NET 5中IdnMapping.GetAscii抛ArgumentException原因及输入要求查询
.NET 5 针对 IdnMapping 的破坏性变更
存在相关破坏性变更,核心原因是.NET 5 对全球化底层实现做了调整:
- .NET Core 3.1 及更早版本在Windows系统上默认使用 Windows 原生 NLS(国家语言支持)组件实现全球化相关API,IdnMapping 遵循 IDNA 2003 标准做域名校验,校验规则相对宽松。
- .NET 5 及以上版本默认跨平台统一使用 ICU(国际化组件库)实现全球化API,IdnMapping 遵循更严格的 IDNA 2008 标准做校验,二者规则差异会导致之前可以正常执行的输入在新版抛出异常。
如果需要兼容.NET Core 3.1 的旧行为,可以通过运行时配置切换回 NLS 实现:
- 在项目的
runtimeconfig.json文件中添加配置:
{ "runtimeOptions": { "configProperties": { "System.Globalization.UseNls": true } } }
- 或者启动程序前设置环境变量
DOTNET_SYSTEM_GLOBALIZATION_USENLS=true。
IdnMapping.GetAscii 输入字符串合规要求
按照 IDNA 2008 标准及.NET 的实现规则,输入的待转换域名需要满足以下要求:
- 域名结构合法:不能以点号开头、结尾,不能出现连续点号
- 标签长度要求:每个标签(点分隔的单个域名段)的 Unicode 原始长度不超过63字符,转换为 Punycode 后的ASCII长度也不能超过63字符
- 总长度要求:整个域名转换为ASCII格式后,包含所有点分隔符的总长度不能超过253字符
- 字符范围要求:不能包含 IDNA 标准禁用的字符,包括不可见控制字符、未被纳入标准的特殊Unicode符号等
你提供的示例触发异常的原因是输入字符串含点的总长度为254,超过了 IDNA 2008 要求的最大253字符的限制,ICU 严格校验后抛出了参数异常。
内容的提问来源于stack exchange,提问作者MkDev
相关产品推荐
相关产品推荐

