Azure Web 应用突然不再支持区域性



出乎意料的是,我们的 Azure Web 应用会喷出有关不受支持的区域性的错误。我们加载了一个国家列表以显示在首页上,但这突然给出了错误。其他各种 Web 应用程序也使用相同的代码,它们没有问题。

下面的代码给出了一个问题。

 private List<SelectListItem> Countries()
        {
            RegionInfo country = new RegionInfo(new CultureInfo("nl-BE", false).LCID);
            List<SelectListItem> countryNames = new List<SelectListItem>();
        foreach (CultureInfo cul in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
        {
            country = new RegionInfo(new CultureInfo(cul.Name, false).LCID);
            countryNames.Add(new SelectListItem() { Text = country.DisplayName, Value = country.DisplayName });
        }
        return countryNames.GroupBy(x => x.Text).Select(x => x.FirstOrDefault()).ToList<SelectListItem>().OrderBy(x => x.Text).ToList();
    }

我在 for-each 中放置了一个 try-catch,这样我就可以查明给出错误的文化。以下区域性突然返回错误:

<errors>
<LCID>4096</LCID>
<Name>ar-001</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>el-CY</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-BB</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-BS</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-HK</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-NL</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>en-SE</Name>
</errors>
<errors>
<LCID>4096</LCID>
<Name>es-419</Name>
</errors>

有人可以帮助我解决这个问题吗?我似乎无法理解为什么这个网络应用程序突然给出这些错误。

Windows中几乎所有的新语言环境都没有分配显式LCID - 因为没有足够的"空间"来应对数百个国家/地区的数千种语言问题。 他们都被分配到0x1000。

在这种情况下,我认为将 LCID 更改为名称可能适合您:

country = new RegionInfo(new CultureInfo(cul.Name, false).LCID);

仅使用区域性名称:

country = new RegionInfo(cul.Name);

当然,LCID 的任何其他使用也需要识别区域性名称。

实际上,我们建议使用完整的区域性名称构造 RegionInfo,因为这比区域名称更明确。 RegionInfo 具有一些"依赖于"语言的属性,例如 DisplayName。 例如,es-US 和 en-US 为"美国"提供西班牙语或英语字符串。

希望有帮助,

-肖恩

我确认这些是刚刚添加到 Azure 应用服务中的新区域性,显然它是以创建 RegionInfo 失败的方式完成的。最简单的重现是:

var culture = new CultureInfo("en-HK", false).LCID;
var region = new RegionInfo(culture);

这失败了:

Unhandled Exception: System.Globalization.CultureNotFoundException: Culture is not supported. Parameter name: culture 4096 (0x1000) is an invalid culture identifier. at System.Globalization.CultureData.GetCultureData(Int32 culture, Boolean bUseUserOverride) at System.Globalization.RegionInfo..ctor(Int32 culture)

我们正在进一步调查。同时,捕获异常并忽略失败的区域性是建议的解决方法。

最新更新