有没有办法指定在站点级别使用哪个字符串比较?

时间:2012-11-13 19:02:39

标签: c# asp.net

我问的原因是因为我发现了一个非常奇怪的错误,只发生在我们的生产箱上。这是一个小例子:

protected void Page_Load(object sender, EventArgs e)
{
    ...
    var form = Request.Form;
    string name = form.GetValueOrDefaultIfKeyExists("firstName");
    string email = form.GetValueOrDefaultIfKeyExists("emailAddress");
    ... 
}

在我们的生产框上 - 在此代码运行后,名称和电子邮件将为String.Empty - 即使表单包含带有'firstName'和'emailAddress'的键。 GetValueOrDefaultIfKeyExists是一种自定义扩展方法,以这种方式实现:

public static Boolean HasKey(this NameValueCollection collection, String key)
{
    return collection.AllKeys.Any(x => x.Equals(key));
}

public static String GetValueOrDefaultIfKeyExists(this NameValueCollection collection, String key)
{
    return GetValueOrDefaultIfKeyExists(collection, key, String.Empty);
}

public static String GetValueOrDefaultIfKeyExists(this NameValueCollection collection, String key, String defaultValue)
{
    return collection.HasKey(key) ? collection[key].Trim() : defaultValue;
}

问题在于我们的生产箱上的HasKey()方法。这在我们的生产箱上返回false,直到我将其更改为此实现:

public static Boolean HasKey(this NameValueCollection collection, String key)
{
    return collection.AllKeys.Any(x => x.Equals(key, StringComparison.OrdinalIgnoreCase));
}

有没有人对行为上的差异有可能的解释?开发框和生产框都使用IIS6.0和asp.net v2.0。我不确定在这里还有什么可以看的......

编辑:当我在localhost上运行页面并通过循环遍历Request.Form键/值将变量转储到页面时,我得到如下输出:

__VIEWSTATE = /wEPDwUJNTE2ODkwODQ2ZGS2XnJpbO5ngrJFByrGtuNn3PkU5A==

LandingPage = ~/Newsletter/thank-you.aspx

SourceDesc = 676

emailAddress = bntest222@test.com

confirmEmailAddress = bntest222@test.com

firstName = mtest

postalCode = 23320

在我们的生产箱上运行相同的代码转储:

__viewstate = /wEPDwUJNTE2ODkwODQ2ZGSWeuNU+/5eQHvpsMc66Ayh4lEdWQ==

confirmemailaddress = mtest332@test.com

emailaddress = mtest332@test.com

firstname = mtest

landingpage = ~/Newsletter/thank-you.aspx

postalcode = 23320
看起来关键是低调的......为什么?

1 个答案:

答案 0 :(得分:0)

正好回答您的问题,但是:FxCop / Code Analysis会警告您项目中没有指定明确的StringComparison或格式提供程序的任何代码,但应该。