.NET应用调用SOAP Web服务报错:区域名称'en-il'不被支持
解决.NET SOAP Web服务调用中的“Culture name 'en-il' is not supported”错误
问题分析
迁移至Windows 11后调用SOAP Web服务报错,核心原因是Windows 11搭载的.NET框架对文化代码的校验更严格,遵循BCP 47规范要求文化代码采用语言代码-地区代码的标准大小写格式(如en-IL),而旧机器的.NET版本兼容了不规范的小写写法(en-il)。客户端发送的Dataset序列化时携带了不规范的en-il文化标识,导致服务端解析XML时抛出异常。
解决方案
1. 修正客户端线程文化设置
在客户端创建或填充Dataset前,强制将线程文化设置为规范的en-IL(或服务端支持的其他文化):
// 设置当前线程的文化与UI文化为规范格式 System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-IL"); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-IL");
如果无需特定地区文化,也可设置为通用的en-US等服务端默认支持的文化。
2. 强制Dataset序列化时使用指定文化
Dataset序列化XML时会自动携带当前线程的文化信息,可手动指定序列化文化避免不规范代码:
XmlWriterSettings xmlSettings = new XmlWriterSettings(); // 指定规范的文化代码 xmlSettings.Culture = new System.Globalization.CultureInfo("en-IL"); using (XmlWriter writer = XmlWriter.Create(Stream.Null, xmlSettings)) { yourDataset.WriteXml(writer); }
若通过Web服务代理自动序列化,可在调用Web服务接口前执行上述线程文化设置。
3. 服务端添加文化兼容处理(无法修改客户端时)
在服务端Web服务方法的入口处,添加不规范文化代码的映射逻辑:
string incomingCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name; // 忽略大小写匹配不规范的文化代码,映射为规范格式 if (incomingCulture.Equals("en-il", StringComparison.OrdinalIgnoreCase)) { System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-IL"); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-IL"); }
4. 对齐.NET框架版本
若旧机器使用的是.NET Framework 4.5及以下版本,可尝试将客户端项目的目标框架版本调整为与旧机器一致,或在app.config中添加兼容性配置:
<runtime> <!-- 启用旧版安全策略与兼容性模式 --> <NetFx40_LegacySecurityPolicy enabled="true"/> </runtime>
内容的提问来源于stack exchange,提问作者Haim Katz
相关产品推荐
相关产品推荐

