著作一覧 |
IE7 or IE8+jquery-1.4.2というレガシーなインフラで、POSTしようとすると、大体80Kバイトくらいのところで、POSTに失敗する。
同時に多発したのだが、そのうち幾つかはサーバー側をWCF RESTで利用する場合の設定の問題だった。
maxReceivedMessageSizeという属性がwsHttpBindingやbasicHttpBindingにあるのだが、既定値が64Kバイトと無暗に小さい(安全側に倒している)のが原因で、これはステータスコード400が返るし、IISトレースで確認できるので、問題ではない。単にmaxReceivedMessageSize属性を大きく設定すれば済む話だ。
問題なのは、IEから外部に出ずに単にエラーになるパターンで、サイズも一定しないし(大体80Kを超えたあたり)、何しろIEから出ないからすごく困る。jqueryがエラーハンドラに返すエラー情報には'error'という文字列が入っているだけなのでまったく解決の糸口にもならない。
さらに、送信すべきデータを失うと困るところがややこしい。
最初のパターン(IIS側で400を返す)であれば、送ったデータはトレースに完全に残るからサルベージできるのだが、IEの中で閉じてエラーになっている場合にはそうはいかない。IEを終わらせれば消えてなくなってしまう。というわけで、IE7を捨ててとりあえずIE8以上を前提とすれば、送信前にlocalStorageへ確保しておけるわけで、送信に成功したら削除し、失敗したらそのまま保持しておくという対応を後から入れることにしたので、ついにlocalStorageを実環境で利用することになる。が、それは将来への対応であって、今起きている実環境については役に立たない。送れないものは送れないからだ。目の前で起きていれば、アドレスバーへjavascript:で適当なDIVかSPANのinnerHTMLに送信するデータを表示させてコピペすればサルベージできるわけだが、そういう状況ではない。
この時は電話ベースの遠隔サポートしていたのだが、ふとWindows7だということに気付いて、タスクマネージャからIEのプロセスダンプを取得してもらって、後からダンプからJSONを探してサルベージしたのだが、これは運が良かっただけで、通常の運用環境ではそんなことができるはずがない。
が、IE(というよりも、IE7やIE8+jqueryなのでActiveXコントロール版のXHRだが)ではPOSTについてはサイズ無制限というような記述しか見ないし、たかだか80Kバイト程度で送信できないというような報告はstackoverflowにも無い。無いということは、よほど特殊な環境か、こちらのバグなのだろうと思うのだが、サルベージできているくらいに、まともに送信データは作られているし、サイズは80Kバイト超えに過ぎないし、60Kバイトくらいなら何の問題もなく処理できているのだから、不思議極まりない。
ワークアラウンドとしてはやたらと複雑になるが、分割送信を実装するしかなくて相当げんなりするのだが、いったい何が原因なのだろうか。
ジェズイットを見習え |