現象
Windows Server上では問題なく動くアプリケーションを、WebApps上で動かした際にクライアント側でHTTPステータスコード502 Bad Gatewayが返ってきてしまうケースがある。その際、内部で500.53 URL Rewrite Module Errorが起きているようであれば、以下の記述が解決策になる可能性がある。
原因
問題なのは、500.53エラーが発生する原因だが、WebAppsでクライアントサイドの監視と、urlCompressionが共に有効になっていることに起因する仕様であるそうだ。
ここで、クライアントサイドの監視とは、javascriptなどを用いたクライアント側での処理をApplicationInsightで監視するための機能で、従来は監視を必要とするページに手動でMS謹製のJavaScript スニペットを挿入しなければいけなかったが、ASP.NETのアプリケーションの場合にはWeb Appsの設定にAPPINSIGHTS_JAVASCRIPT_ENABLEDを追加し値をtrueとすることで簡単に実現することができるようになった。
Enable Client Side Monitoring In Azure With Application Insights
Application Monitoring for Azure App Service - Enable client-side monitoring
一方、urlCompressionだがこちらはアプリケーションのコンテンツの圧縮を行うかを指定している。IIS7.5以上では、既定で静的コンテンツ(GIF ファイルや HTM ファイルなど、変更されないコンテンツ)及び動的コンテンツ(サーバー上のスクリプトまたはコード - つまり、ASP.NET ページ - によって生成される)の両方が圧縮される。圧縮によって帯域幅の使用量は減少するが、CPU 使用率は増加するデメリットもある。
回避策
これらの二つの設定が衝突してしまい500.53が発生し、結果応答が返らないことからWeb Serverが502エラーと解釈してクライアント側に通達するという仕組みになっているらしい。で、回避策としてはWeb Appsの設定でAPPINSIGHTS_JAVASCRIPT_ENABLEDをtrueからfalseに(あるいは設定値を削除)するようにとMSのサイトには書かれている。
Azure App Service のパフォーマンスの監視 - トラブルシューティング
コメント
どちらの設定もそれぞれ大事な機能のように思えるが、現時点でMS側の見解としてはクライアントサイドの監視を諦めろということらしい。
未検証だが、JavaScriptスニペットをページにすべて埋め込めば正常動作をするのかもしれないが、スクラッチで作成するアプリケーションならまだしもパッケージとして販売をされているものの場合には、WebApps専用の対応を行うのも難しい場合があると思われる。
なにか上手い方法があればコメントなどしていただけると助かります。