しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web サイトに追加されている ASP.NET の設定について

Azure Web サイトの App Settings にはデフォルトで以下のような設定が追加されています。

f:id:shiba-yan:20141101193712p:plain

aspnet:PortableCompilationOutput と aspnet:DisableFcnDaclRead という設定は名前から ASP.NET に関係する設定ということは分かりますが、これまでに見たことが無かったので調べてみました。

aspnet:PortableCompilationOutput

検索してみると以下の KB がヒットしました。

Hotfix rollup 2803755 is available for the .NET Framework 4.5 in Windows 8 and Windows Server 2012

.NET Framework 4.5 の ASP.NET ビューのコンパイラには、最新版か判断するためにコンパイルを行ったマシンの情報を使う挙動が原因で、コンパイル結果を複数のマシン間で共有できないという問題があるようです。

この設定を追加することで、ポータブルな形でコンパイルが行われるみたいです。オートスケールやフェールオーバーで仮想マシン間をころころと移動する Azure Web サイトでは有効にしておくべき設定でした。*1

aspnet:DisableFcnDaclRead

さっきの設定は名前から割と想像できたんですが、こっちの設定は分かりにくいです。検索してみたところ、特に Hotfix などで追加されたものというわけではなさそうです。

debugging.io blog | Undocumented asp.net flag to improve performance of asp.net website when content is hosted on SMB share

Azure Web サイトはアーキテクチャ的にユーザーデータは SMB でマウントされた Blob に保存されています。ASP.NET アプリケーションは SMB で共有されている仮想ディレクトリ上で動かすと、パフォーマンスの低下や以下のようなエラーが発生することがあるようです。

"The network BIOS command limit has been reached" error message in Windows Server 2003, in Windows XP, and in Windows 2000 Server

原因は ASP.NET はファイルの変更監視時に DACL を読み込むみたいですが、この処理が SMB 上だと問題になるみたいです。なので DACL の読み込みをスキップする設定がこれです。

これも Web サイトのアーキテクチャ的に必須な設定ですね。SMB で wwwroot 以下をマウントしている場合には設定を追加しておきましょう。

*1:というか ASP.NET が動く PaaS なら必要な気がしないこともない