最近撰寫程式時,使用 Visual Studio 2015 起始偵錯時,居然會失敗,點選執行後,約過了幾秒鐘後,Visual Studio 2015 又退回到原來的畫面,查看右下角,IIS Express也沒有啟動,奇怪,昨天可以正常執行的專案,今天卻完全無法執行?到底怎麼回事?
緣由
最近撰寫程式時,使用 Visual Studio 2015 起始偵錯時,居然會失敗,點選執行後,約過了幾秒鐘後,Visual Studio 2015 又退回到原來的畫面,查看右下角,IIS Express也沒有啟動,奇怪,昨天可以正常執行的專案,今天卻完全無法執行,是連 IIS Express 都無法啟動。
判斷問題
這時馬上又啟動了內心那一股 Troubleshooting 的那一股初心,誓言就是想要查出問題到底在哪?初步研判,應該是 IIS Express 啟動失敗,於是想,這一類的應用程式啟動失敗必定留下事件紀錄,於是馬上到 EventLog 查看,果不其然,在事件檢視器裡的 [應用程式] 發現如下紀錄:
從事件訊息的意思上來了解,是要開始進行 HTTP 通訊時,啟動核心的 http.sys 元件時,可能因為不正確的設定導致 IIS Express 啟動失敗,真是從來沒遇過的問題 =.=
根據事件的ID與來源在網路上找到官方的說明:
https://technet.microsoft.com/en-us/library/dd316026(v=ws.10).aspx
根據說明中所提到的解決方案,可以使用 [本機群組原則編輯器] 到 [Windows 設定]\[安全性設定]\[畚箕原則]\[使用者權限指派] 下面的 [略過周遊檢查] 裡,將 EveryOne 與 Users 的角色加入。但是我點開時發現,我的本來就存在了!
而且,就算我將 w3svc & http 這兩個服務重新啟動後,也還是一樣,這時,又使案情陷入了膠著之中。
但是,以前在公司裡就被稱為為 Troubleshooting 的狂人的我,怎麼可以就此打住?一定要把原因查出來才可以。
皇天不復苦心人,讓我找到一篇文章,文章中所描述的狀況、發生的錯誤內容與我完全相同。
且內容中提到,可試試透過設定 HTTP URL 命名空間保留區來解決此問題,透過下面的命令(中間的 port 要換成你的):
netsh http add urlacl url=http://localhost:8999/ user=everyone
執行完畢的畫面如下:
有趣的是,執行完畢後,在執行剛剛執行不起來的專案居然成功的執行起來了。由最下方的說明了解到可能是 ACL 的項目裡有衝突的項目,但是心中還是有些疑惑,到底是為什麼,自己判別主要原因是因為對於 HTTP 設定通訊的底層作業不了解的關係,於是繼續爬文了解 netsh 指令中的 urlacl 的意義是什麼。
後來爬到下面文章後了解,原來應用程式要進行 HTTP 通訊時,必須將該 HTTP URL 的權限指派給特定的使用者群組,而在 IIS 下面,這個動作通常都是 IIS 建立應用程式時自動幫您設好,但如果您是使用 Self-Host 啟動 HTTP 通訊時,這個動作就是透過命令來達成,而且在 Windows 2003/XP 時代是使用 HttpCfg.exe 工具來達成,在 Windows 7 之後的系統是使用 netsh.exe 命令列工具來達成。
後記
每次查到最後都會發現,我不懂的底層知識還是太多了,每每還是只能透過每一次的 Troubleshooting 之中來學習,讓自己更了解這些運作的細節。
參考資料:
https://technet.microsoft.com/en-us/library/dd316026(v=ws.10).aspx
http://blog.700cb.net/2015/05/iisexpress-error-description-access-is-denied-0x80070005/
https://msdn.microsoft.com/zh-tw/library/ms733768(v=vs.110).aspx
簽名:
學習是一趟奇妙的旅程
這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。
軟體開發之路(FB 社團):https://www.facebook.com/groups/361804473860062/
Gelis 程式設計訓練營(粉絲團):https://www.facebook.com/gelis.dev.learning/
如果文章對您有用,幫我點一下讚,或是點一下『我要推薦』,這會讓我更有動力的為各位讀者撰寫下一篇文章。
非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^