我们有一个使用asp.net 2.0文化的多语言站点。通过将URL重写为查询字符串来设置当前区域性。 (〜/es/blah.aspx是〜/blah.aspx的西类牙语版本-重写为〜/blah.aspx?lang = es)

测试区域性的代码如下:

    System.Globalization.CultureInfo ci;
    try
    {
        ci = new System.Globalization.CultureInfo(Request.QueryString["lang"] ?? string.Empty);
    }
    catch
    {
        ci = new System.Globalization.CultureInfo(string.Empty);
    }

如果未设置文化,则默认为英语127。如果存在文化,则该页面上的所有链接都将使用正确的文化名称作为前缀。

某种程度上,蜘蛛以〜/www.test.com/blah.aspx的形式拥有一些链接,并以www.test.com的文化冲击着我们的网站,这泛滥了我们的错误记录。

除了捕获异常之外,还有什么方法可以测试区域性名称是否有效?

最佳答案

我以为我可以快速进行测量,因此打开了一个快速控制台应用程序。

它基本上使用所有3种方法(构造函数,LINQ和foreach)在一个循环中从字符串中获取CultureInfo 10000次。为了简洁起见,我删除了秒表和控制台输出。

string culture = "en-GB";
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
for (int i = 0; i < 10000; i++)
{
    try
    {
        CultureInfo c = new CultureInfo(culture);
    }
    catch
    {
    }
}
for (int i = 0; i < 10000; i++)
{
    CultureInfo c = cultures.FirstOrDefault((x) => x.Name == culture);
}
for (int i = 0; i < 10000; i++)
{
    foreach (CultureInfo c in cultures)
    {
        if (c.Name == culture)
            break;
    }
}

结果如下...
Try Catch: 00:00:00.0023860
LINQ: 00:00:00.0542459
ForEach: 00:00:00.0238937

如果删除文化变量并在每次迭代中都调用它,则LINQ和ForEach循环大约需要2.5秒。

因此,如果希望获得大量有效输入而只有奇数个无效输入,则使用构造函数将是有利的。但是,如果从en-GBTEST的输入更改了该值,则情况将发生巨大变化。
Invalid Culture Try Catch: 00:00:39.7163513
Invalid Culture LINQ: 00:00:00.0791752
Invalid Culture ForEach: 00:00:00.0291480

显然,我的测试应用程序不是真实场景,但是由于OP表示这是根据每个请求调用的,因此我可以想象在大型Web应用程序中,此代码可能会被调用很多。这可能是拒绝或服务媒介,通过向Web服务器发送垃圾邮件,并要求所有垃圾邮件都包含无效的区域性参数,从而占用所有CPU。

关于c# - ASP.Net验证区域性名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/480425/

10-11 18:47