为.NET Web应用在Windows上注册自定义文化失败问题排查
我们需面向沙特阿拉伯用户部署.NET Web应用,初始配置ar-SA文化后,发现基础日历与符号不符合需求,遂尝试创建自定义文化(如ar-SAR、ar-ZZ)。同一注册脚本在Windows Server 2019上执行成功,但在Windows Server 2012R2上失败,报错提示“ar-ZZ是无效的文化标识符”。
注册脚本
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; using System.Threading.Tasks; namespace CultureRegistration { class CultureLdml { static void Main(string[] args) { CultureAndRegionInfoBuilder carib = CultureAndRegionInfoBuilder.CreateFromLdml("ar-ZZ.ldml"); carib.Register(); } } }
编译命令
csc /r:sysglobl.dll culture.cs
执行报错信息
Unhandled Exception: System.Xml.Schema.XmlSchemaValidationException: Culture is not supported. Parameter name: name ar-ZZ is an invalid culture identifier. ---> System.Globalization.CultureNotFoun dException: Culture is not supported. Parameter name: name ar-ZZ is an invalid culture identifier. at System.Globalization.CultureInfo.GetCultureInfo(String name) at System.Globalization.CultureXmlReader.ReadIdentityElement() at System.Globalization.CultureXmlReader.Parse() at System.Globalization.CultureXmlReader..ctor(String fileName) --- End of inner exception stack trace --- at System.Globalization.CultureXmlReader..ctor(String fileName) at System.Globalization.CultureAndRegionInfoBuilder.CreateFromLdml(String xmlFileName) at CultureRegistration.CultureLdml.Main(String[] args)
问题原因排查
.NET Framework版本对标识符的校验差异
Windows Server 2012R2默认搭载的.NET Framework版本(最高支持到4.8)中,CultureAndRegionInfoBuilder对自定义文化标识符的校验规则更严格。ZZ是ISO标准中保留的“未知区域”代码,旧版本.NET Framework不允许将其用于创建自定义文化;而Windows Server 2019对应的.NET Framework版本放宽了这类限制,允许使用ZZ作为区域部分。LDML文件解析时的文化校验触发
从错误栈可以看到,异常是在CultureInfo.GetCultureInfo方法中抛出的——旧版本.NET Framework解析LDML文件的<identity>节点时,会严格验证文化名称的合法性,当文件中指定ar-ZZ作为文化标识时,系统会直接判定该标识符无效,无法完成后续解析。系统级文化支持的版本差异
Windows Server 2012R2的系统文化数据库对自定义文化的支持不如2019完善,对于ZZ这类特殊区域代码的自定义文化,系统层面不认可其有效性,而2019版本的系统文化数据库已经支持这类自定义场景。
内容的提问来源于stack exchange,提问作者Ian

