我问的原因是因为我刚刚发现了一个非常奇怪的错误,它只发生在我们的生产盒上。这是一个小例子:
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
看起来键是小写的……为什么?