きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

ImageButtonがIE10でエラーになる(ことがある)件

本日遭遇した障害が、検索しても日本語情報に行きあたらなかったので、備忘録も含めてメモしておきます。

現象

障害の連絡があり調べたところ、

  • IE10(Win8のRTM版、およびWin7のPreview版ともに)でのみ
  • ImageButtonでポストバックした際に

例外が発生していることを確認。

スタックトレースを見ると以下のとおりでした。

System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Web.UI.WebControls.ImageButton.LoadPostData(String postDataKey, NameValueCollection postCollection) 
at System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection)
at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

どう見ても、自分で書いたところではなくASP.NETのインフラ内での処理で発生している感じになっています。またIE9以下やその他のブラウザ(Chromesafarifirefox)でも発生しません。


ちょっと困り果てていたのですが、ネットを検索してみるとドンピシャのものが引っかかりました*1

Oh...

ということで、上記の情報と私が確認したところを総合すると、

  • IE10(Windows 8およびWindows 7双方)で
  • ImageButtonコントロールで、UpdatePanelの非同期ポストバックを発生させた場合で、
  • レンダリングモードが互換モードでない場合で
  • .NET Frameworkが2.0(〜3.5)、もしくは4.0のば場合

に発生する…ようです。
#ボタンがUpdatePanel内にある必要はなさそうで、非同期ポストバックのトリガになっていれば条件を満たすようです

対応について

上記のConnectを見ると、12/31にHotFixが提供されていることが書かれているのですが、Windows 2003 ServerにこのHotFixを適用してはみたものの、症状が改善されませんでした。
うーん。


取り急ぎ今回は、該当部分を同期ポストバックに書き換えることで減少が収束することを確認できたので、この対応としました*2


そのうちちゃんとした修正プログラムが出るかもしれませんが、それまでにどうにかしたい場合は以下のいずれかの手段をとる必要がありそうです。

  • ImageButtonでの非同期ポストを止める(ImageButtonを辞める or 非同期ポストを止める)
  • .NET Framework 4.5に移行する
  • レンダリングモードをIE9互換にする(X-UA-CompatibilityでIE9以下を指定する)


#…早く正式なパッチが出てくれることを願いつつ。

*1:というか同僚が探してくれました。

*2:あまり重要でない場所でしか非同期ポストバックを使っていなかったのと、ちょっとじっくり検証する時間が取れなかったため