進行System.Web.MimeMapping.GetMimeMapping之MIME對應後,變成JSON檔案下載之問題

日前在處理一件利用泛型處理常式(.ashx)輸出JSON格式資訊的問題,裡面有用到System.Web.MimeMapping.GetMimeMapping這個靜態方法,依照所指定的檔案副檔名,轉換成MIME後自動指定到ContentType,結果出現了結果不一致的問題。所謂的結果不一致就是同一支程式碼,我在Chrome裡面觀察會變成JSON檔案下載,可是在Edge裡面又變成可以正確地把JSON打在網頁上,真的很詭異。

經過抽絲剝繭後,發現是瀏覽器對於「application/octet-stream」的解釋問題,Chrome會將其變成檔案下載,而Edge會將這個資料辨識成正確的JSON格式文件,因此直接將其顯示在網頁上。但是,這些都不是真正的問題,問題是本來應該要被系統自動輸出的MIME:「application/json」,怎麼就這樣憑空被改成「application/octet-stream」了?這樣的程式碼我也有在其他的地方撰寫過,用的也都是.NET Framework 4.5以上,為何其他地方一樣的寫法就不會有問題呢?

調用程式碼如下:

oContext.Response.HeaderEncoding = System.Text.Encoding.UTF8;
oContext.Response.ContentType = System.Web.MimeMapping.GetMimeMapping(".json");

經過一番搜尋後,終於理解到System.Web.MimeMapping.GetMimeMapping與你的.NET Framework版本號無關,反而與你的執行環境「IIS」、「Registry」比較有關,於是我開始了解到為何我之前的寫法可以被正確的解出「application/json」,因為我的執行環境是Windows Server 2016,而解不出這個JSON MIME的環境是比較老舊的Windows Server 2008。

一旦找出問題,就比較好修正了。

修正System.Web.MimeMapping.GetMimeMapping在比較老舊的Windows下,無法正確輸出MIME的方式:

Step 1. 打開Internet Information Services,請到最上方的機器設定項次,而不要點選到個別網站,這樣才能全網站套用繼承,看到後點選右方中間的「MIME類型」。

Step 2. 點選新增,然後在副檔名中輸入「.josn」、MIME類型輸入「application/json」。

Step 3. 可以的話,做一下IISRESET,就大功告成了。

System.Web.MimeMapping.GetMimeMapping application/octet-stream application/json FileDownload WindowsServer 2008 WindowsServer2012