某些系统上的System.Global.CultureNotFoundException,但不是其他系统

时间:2018-03-07 22:20:22

标签: c# asp.net globalization

我们要求客户将Haitian Creole resx文件添加到我们的应用中。我们得到了翻译,然后我将其插入,但我立即发现浏览器支持 ht 作为语言/区域代码。 Chrome不允许您在任何地方输入它。 IE 11允许您将其作为自定义代码输入。只有Edge和Firefox提供了它。

但令我感到困惑的部分是,当我使用插入的resx文件进入调试系统时,我使用浏览器访问该站点时,我在以下行中获得了System.Global.CultureNotFoundException:

CultureInfo ci = CultureInfo.CreateSpecificCulture(cultureName);

但是,如果我使用我们的发布版本转到另一个系统拥有resx文件,那么就没有错误。显然我也没有得到任何海地克里奥尔语的翻译,但是当用ht提供时,代码相同并不会爆炸。

我已执行相同的powershell命令列出两个系统上支持的语言,而海地克里奥尔语不在任何一个系统的列表中。

[system.Globalization.CultureInfo]::GetCultures('AllCultures')

当浏览器呈现无法识别的代码时,是否有某种发布模式可以悄悄地回归到系统语言?接近我可以说我的测试系统之间的唯一区别是发布模式/没有ht resx和调试模式/使用ht resx。

我不明白为什么我在两个地方都没有得到同样的例外......

由于

2 个答案:

答案 0 :(得分:0)

有许多优化,这里可能的罪魁祸首是Just-in-time compiler。如果它检测到任何可以归类为"死代码",它会毫不犹豫地将其删除。

当我尝试在具有2 GiB限制的x32系统上编写强制OOM异常的代码时,我遇到了这个问题:如果有问题的部分被检测为"死代码",我确实不能强迫OOM。一个简单的输出顺序解决了这个问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOM_32_forced
{
    class Program
    {
        static void Main(string[] args)
        {
            //each short is 2 byte big, Int32.MaxValue is 2^31.
            //So this will require a bit above 2^32 byte, or 2 GiB
            short[] Array = new short[Int32.MaxValue];

            /*need to actually access that array
            Otherwise JIT compiler and optimisations will just skip
            the array definition and creation */
            foreach (short value in Array)
                Console.WriteLine(value);
        }
    }
}

答案 1 :(得分:0)

当您的应用具有区域设置代码的resx文件时,似乎会发生System.Global.CultureNotFoundException异常,但广泛的系统无法识别它。

利用IE 11功能输入您想要的任何奇怪的自定义代码,我添加了 xx-xx 并将其放在我的列表顶部。当然,我没有xx-xx的任何resx文件。

使用带有xx-xx的Accept-Language标头对站点的请求不会抛出System.Global.CultureNotFoundException异常;它只是静静地移动到列表中的下一个。

我的开发站点和其他版本构建之间的区别在于我的开发站点在构建中有.ht.resx文件,而其他qa站点没有