私が尋ねる理由は、私たちのプロダクションボックスでのみ発生した本当に奇妙なバグを見つけたからです。ここに小さな例があります:
protected void Page_Load(object sender, EventArgs e)
{
...
var form = Request.Form;
string name = form.GetValueOrDefaultIfKeyExists("firstName");
string email = form.GetValueOrDefaultIfKeyExists("emailAddress");
...
}
プロダクションボックスでは、フォームに「firstName」と「emailAddress」のキーが含まれていても、このコードが実行された後、名前と電子メールはString.Emptyになります。これ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.netv2.0を使用しています。ここで他に何を見るべきかよくわかりません...
編集:ローカルホストでページを実行し、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
キーが小文字になっているようです...なぜですか?