我问的原因是因为我发现了一个非常奇怪的错误,只发生在我们的生产箱上。这是一个小例子:
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
看起来关键是低调的......为什么?
答案 0 :(得分:0)
不正好回答您的问题,但是:FxCop / Code Analysis会警告您项目中没有指定明确的StringComparison
或格式提供程序的任何代码,但应该。