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
相关产品推荐
相关产品推荐

