2009年3月8日

IIS7 未啟用 Application Development Features 會導致 HTTP Error 500.19 (The requested page cannot be accessed because the related configuration data for the page is invalid.)

上禮拜為了寫一個小小的測試程式,必須要實際佈署到 IIS 才能驗證功能是否正確,
所以第一次嘗試在 Win7 Beta (x64) 上設定 IIS7,沒想到不小心就搞了一個多小時…
要啟用 IIS7,(從 Vista 之後)第一步就是從 Control Panel 中的
「Programs and Features」中執行「Turn Windows features on or off」,
在我啟用 IIS7 之後,就開啟 browser 瀏覽到我的測試頁面,結果出現下面這個錯誤:

IIS7_HTTP Error 500.19

hmm … 仔細的看了一下我的 web.config,預設是不會有 <httpErrors /> 這個設定的,
所以應該不是我或者 VS2008 手賤亂改設定造成的問題。
(有趣的是,我只是要瀏覽 .htm 網頁,還不是執行 .aspx 網頁哦)


雖然受到了小小的驚嚇,但是由於 IIS7 提供了非常豐富的錯誤描述資訊,
所以我想這也沒什麼了不起的,想必 Google 一下很快就會有結果了吧!

果不其然, 很快的我就查到了跟我的狀況完全相符的描述:
IIS7 HTTP Errors Configuration on Lockdown

OK, 以下這段是重點:

In order to set <httpErrors /> you have to open up applicationHost.config on your server and unlock the node or specifically set the value for the site you want. I like to unlock the node and set <httpErrors /> within the web.config of my application. I find this much clearer and more isolated then having application specific settings defined within the applicationHost.config on a specific server.


這篇文章提到了 IIS7 錯誤訊息中沒有明講的「applicationHost.config」這個關鍵檔案,
於是繼續搜尋看看這個檔案到底位置在哪,要如何修改:Editing Applicationhost.config on 64 bit Win 2008,嗯,跟我的環境蠻合的,那就仔細讀一下內容吧!

稍微看了一下,這個檔案應該位於在「c:\windows\system32\inetsvr\config\applicationhost.config」,但是正如這篇文章所說,我的 UltraEdit 和 VS2008 顯然都是 32bit application,根本無法開啟這個檔案!(幸好我沒有改內建的 Windows Explorer,所以還看的到檔案)

於是乎,我依照作者的建議,用萬能的 notepad 來開啟 applicationhost.config,
鏘鏘鏘鏘!檔案順利打開了,但是 <httpErrors /> 區塊的設定如下:
<section name="httpErrors" overrideModeDefault="Allow" />
所以完全就是可以允許每個 web application 隨意亂改 httpErrors 的處理方式嘛!
 
那麼揪~~~~竟是為什麼我會收到 HTTP Error 500.19 呢

按照過去的經驗,通常會出現這種好像鬼打牆的靈異現象,很可能是因為某些最基礎(或者說底層)的環境設定不正確,導致系統丟出這種沒頭沒腦的錯誤(仔細看一下上圖,Config Source 指出的區塊根本就和 <httpErrors /> 無關,如果繼續往 <httpErrors /> 這條死胡同裡面鑽,那天就不用睡覺了),於是乎我開始尋找 IIS7 的初始設定有沒有什麼要特別注意的地方,結果無意間看到一篇讓我靈機一動的文章:Server Error HTTP Error 404.3 Not Found,之前在 Vista 上設定 IIS7 的時候也看到這篇,看到 screenshot 我才想到,我忘記設定 Application Development Features 了

在第一次 turn on IIS7 的時候,要特別注意以下設定:
(根據這次實驗,完全不啟用 Application Development Featues 的話,連靜態 html 網頁都開不起來)

IIS7_NecessaryFeatures

設定完成後,在 IIS7 的 Handler Mappings 中可以看到以下內容:
IIS7_HandlerMappings_Correct

後來我又實驗了一下,把 Application Development Features 關掉的話,Handler Mappings 會變成這樣(沒有 .aspx、.asmx mappings):
IIS7_HandlerMappings_Incorrect

此時去瀏覽網頁又會出現 HTTP Error 500.19,所以這個謎的真相就是這樣 … Orz
印象中 IIS6 有個設定叫做 Web Service Extensions,有時候 ASP.NET v2.0.50727 的 mapping 消失的時候,也會出現無法處理 ASP.NET 2.0 網頁 request 的狀況,
但是丟出的錯誤訊息是很明確的(忘記是啥了@@)。IIS7 在這種狀況下居然丟出一個毫不相干的錯誤訊息,反而變成很不 friendly 了 …


(不過也只有像我一樣一開始腦殘忘記設定 Application Development Featurs 的人才會感受到這種痛苦就是了 .. Orz 太信任 IIS7 的錯誤訊息也不一定是件好事…)

2 則留言:

Maxi Ng 提到...

我轉貼了你的文章。
希望得到你的同意。
如果不同意我會立刻把連結拿掉。

因為我對CC不是很熟。
感謝你的文章。
我的文章
http://www.dotblogs.com.tw/maxi/archive/2010/01/21/13194.aspx

Unknown 提到...

老實說我對 CC 也沒有深入去了解,但我不介意文章被轉錄 ^^ 希望可以解答一些疑惑,節省大家的時間 :)

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D