2

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

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

看起来键是小写的……为什么?

4

1 回答 1

0

不能准确回答您的问题,但是:FxCop/代码分析会警告您项目中未指定显式StringComparison或格式提供程序但应该指定的任何代码。

于 2012-11-13T20:11:40.757 回答