検索
タグ
ASP.NET
.NET
ASP.NET MVC
Visual Studio
F#
Azure
ASP.NET Core
ライトニングトーク
Plone
Selenium
AJAX
C#
jQuery
SQL Server
JavaScript
ADO.NET Entity Framework
EFCore
WebMatrix
LINQ
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2024年 11月 2024年 10月 2024年 09月 2024年 08月 2024年 04月 2024年 03月 2024年 02月 2024年 01月 2023年 12月 2023年 11月 2023年 10月 2023年 09月 2023年 08月 2023年 07月 2023年 06月 2023年 05月 2023年 04月 2023年 03月 2023年 02月 2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 |
2012年 04月 19日
ブラウザに日本語ファイル名でダウンロードさせるASP.NET による Web アプリケーション開発での話。ASP.NET Web アプリ側からブラウザ側への応答返信時、Content-Disposition 応答ヘッダに、"attachment; filename=~" という値を指定すると、ブラウザ側ではファイルのダウンロード処理が行われる。 ダウンロード処理時のファイル名は、この応答ヘッダの filename=~ に指定する。 たとえば次のようなコードがあったとすると、 Response.AppendHeader("something.zip" というファイル名で応答が保存されるのだ。 このときの "ファイル名" に日本語のようなマルチバイト文字列を指定しようとすると、実は結構やっかいだ。 とりあえず今日現在の状況をおさらいしてみると、マルチバイト文字列をダウンロードファイル名に指定する方法は、ブラウザに応じて以下のとおりのはずである。
すみません、Opera は不勉強でわからないです... (ただ、これは想像だけど、Opera は最新仕様に早くから対応するイメージがあるので、たぶん、RFC 6266 のとおりでOKじゃないかな?) それでもWebkit 系ブラウザでファイル名文字化けさてところで、上記のとおりのダウンロードファイル名指定を実装したにもかかわらず、動作検証中に、Webkit 系ブラウザでのみ、日本語ファイル名によるダウンロードでファイル名が文字化けする、という怪現象が発覚した。それも本番環境をかなり正確に模擬した検証環境でのみ発生するのだ。 開発環境ではぜんぜん再現しない。 IE9 の開発者ツールでネットワークのキャプチャで観察しても、たしかに、検証環境から返される応答ヘッダはしっかり文字化けしていた。 Web アプリケーションのバイナリは、いずれの環境でも慎重に正確に一致させてある。 よって、アプリケーション側のコードになにか原因があるとは考えにくい。 となると、原因があるのは、アプリケーションを取り囲む環境構成にあるのではないか。 検証環境とそれ以外の環境の差異はなにか。 それはリバースプロキシの存在にあった。 IIS7 + ARR検証環境では、Web サーバーが直接クライアントにさらされているのではなく、IIS7.5 + Application Request Routing 拡張機能 (以下 ARR) によるリバースプロキシを介して接続する構成になっていたのだ。Application Request Routing - IIS TechCenter http://technet.microsoft.com/ja-jp/iis/ee839425 すなわち、IIS7.5 + ARR が Web サーバーからの応答を中継するときに、何か起きているのではないだろうか。 ということで試しに、IP 経路を変更したりして、リバースプロキシを迂回して直接 Web サーバーと通信できるように構成し、改めて Safari for Windows でダウンロードしてみた。 すると、さすがに期待どおり、正しい日本語ファイル名でダウンロードされるようになった。 ということで、ほぼ間違いなく犯人は ARR である確信を得た。 しかし原因はそうだとしても、どうすればこの現象を回避できるのだろうか。 ARR の設定を IIS マネージャを通してあれこれ探索したりいじってみたりした。 しかし結局、応答ヘッダの中継とその文字コードに関係しそうな設定項目をつきとめることができなかった。 そこでいったん手を置いて休憩し、ゆっくり考えてみた。 文字化けしている、ということは、Web サーバーが返した UTF-8 エンコードされている応答ヘッダを、ARR が正しくデコードできていないに違いない。 いったい ARR は、応答ヘッダのエンコード方式が何であるとして扱っているのだろうか。 そこでふと思い立って、ASP.NET Web アプリ側が返す応答ヘッダのエンコードを SHIFT-JIS に変えてみた。 設定は簡単。 当該 ASP.NET Web アプリの web.config 構成ファイルをエディタで開き、system.web - globalization セクションの responseHeaderEncoding 属性に "shift_jis" と書いて保存すればOK。 これで再び ARR によるリバースプロキシ経由で Safari for Windows によるアクセスを行うと、正しく日本語ファイル名でダウンロードされるようになった。 とりあえずこれにて一件落着とした、が...。 たまたま今回のアプリでは、応答ヘッダのエンコードを SHIFT-JIS にしても問題ない仕様であった。 しかし、日本語以外のファイル名や、SHIFT-JIS エンコーディングの範疇外の文字を含むファイル名を指定したい場合は、これではお手上げだ。 ARR の挙動が本当に変えられないものなのか、まだまだ要調査である。
by developer-adjust
| 2012-04-19 23:45
| .NET
|
ファン申請 |
||