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

Uri.IdnHost处理长主机异常:是否正常及修复方案咨询

Uri.IdnHost处理长主机地址异常的问题

这是正常行为吗?

是正常行为。因为IDN(国际化域名)转换为Punycode后,DNS规范明确要求:每个域名标签(点分隔的部分)长度不能超过63个字符,整个域名的总长度(包含点)不能超过253个字符。你的长俄文主机名转换为Punycode后会超出这个限制,所以Uri.IdnHost无法正常处理——要么直接返回原主机名,要么出现转换异常。

修复方案

放弃使用Uri内置的IdnHost属性,改用System.Globalization.IdnMapping类手动处理,它的灵活性更强,还能明确捕获超长域名的转换问题:

示例代码

using System.Globalization;

void checkIDN(string urlString)
{
    var uri = new Uri(urlString);
    var idnConverter = new IdnMapping();
    
    try
    {
        string punycode = idnConverter.GetAscii(uri.Host);
        Console.WriteLine($"{uri.Host,-40} ---> {punycode}");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine($"{uri.Host,-40} ---> 转换失败:{ex.Message}");
    }
}

checkIDN("https://единая-дата-объединения-застройщиков.рф");
checkIDN("https://единая-дата-объединения-застройщико.рф");
checkIDN("https://единая-дата-объединения-застройщик.рф");
checkIDN("https://единая-дата-объединения-застройщи.рф");
checkIDN("https://единая-дата-объединения-застройщ.рф");
checkIDN("https://единая-дата-объединения-застрой.рф");
checkIDN("https://единая-дата-объединения-застро.рф");

额外说明

  • IdnMapping.GetAscii()会严格遵循IDN规则转换域名,一旦超出长度限制就会抛出ArgumentException,你可以捕获该异常并给出“域名过长不符合规范”之类的提示。
  • 如果非要处理超长域名(注意:这种域名不符合DNS规范,无法在真实网络环境中解析),可以调整IdnMapping.AllowUnassigned和IdnMapping.UseStd3AsciiRules属性放宽转换规则,但不建议在生产环境中这么做。

内容的提问来源于stack exchange,提问作者sDima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:15:28