当前位置:  开发笔记 > 编程语言 > 正文

ASP.Net验证文化名称

如何解决《ASP.Net验证文化名称》经验,为你挑选了3个好方法。

我们有一个多语言网站,利用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的文化锤击我们的网站,并充斥着我们的错误记录.

除了捕获异常之外,有没有办法测试文化名称是否有效?



1> BenCr..:

我想我可以快速测量一下,这样可以打开一个快速的控制台应用程序.

它基本上使用所有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

如果删除culture变量并在每次迭代时调用它,那么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应用程序中,这个代码可能会被调用很多.它可能是拒绝或服务向量,通过向所有具有无效文化参数的请求发送垃圾邮件来占用所有CPU.



2> 小智..:

几乎与使用更紧凑的linq表达式所述的答案相同:

private static bool IsValidCultureInfoName(string name)
{
    return 
        CultureInfo
        .GetCultures(CultureTypes.SpecificCultures)
        .Any(c => c.Name == name);
}



3> Roger Lipsco..:

你不具备使用LINQ:

private static bool IsValidCultureName(string cultureName)
{
    CultureInfo[] cultures =
        CultureInfo.GetCultures(CultureTypes.SpecificCultures);
    foreach (CultureInfo culture in cultures)
    {
        if (culture.Name == cultureName)
            return true;
    }

    return false;
}

这可能是相当昂贵的,但可能仍然比处理异常更便宜,这是非常昂贵的 - 虽然在采取我的话之前衡量差异.

我不认为定义的文化列表会在.NET版本之间发生变化,所以你应该在启动时获取列表并将其缓存到某个地方.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有