2013年4月2日

Windows Azure - 在Cloud Service中,使用多個Instance會導致IIS Express錯誤

這個問題,卡了我超級無敵久,可以說從去年12月開始,就出現了這個問題,直到最近,才終於請Microsoft的CSS部門的Michael幫忙解決…

至於為什麼會發生這個問題,老實說,也沒辦法還原了,只能歸咎,可能因為平常裝了太多測試版本的東西而導致。

這個錯誤大致上是這樣子的,平常我們在本地端使用Cloud Serivce開發時,會啟用IIS Express並帶起模擬器,平常使用都沒問題,但當我們啟用超過一個instance的時候就會發生錯誤;如下圖設定時,再啟用模擬器的時候,就會發生錯誤。

image

當設定一個instance以上,並啟用偵錯的時候,正常應該是開開心心的看到模擬器起來,但這次的問題就是,模擬器雖然起來了,但是IIS Express報錯了…

會出現 IIS Express Worker Process 已經停止運作…然後任何的錯誤訊息都不給我 ( 翻 )。

IIS Express Work Process Error

當然,這個過程,其實也找了很久,而且如果開模擬器來看,也會發現兩個Role阿,很正常啊。

Azure Computer

但實際上,如果有真的去測試,會發現,只會進到一台Role,死都不會進入到另外一台Role…後來抽絲剝繭,終於發現一個明顯的錯誤,如下圖;我們可以發現,原本啟用兩個Instance,應該會出現兩個站台才對,但這邊才出現一個站台。

IIS IP Error

或許這樣感覺不出來,所以我用Azure的VM,建立了一台正常的機器來比對;如以下兩張圖…可以發現到甚麼!?嗯,沒錯,第一個是少了站台,第二個是IP位置不同!!?

IIP IP Correct 1

IIP IP Correct 2

當然,我產生的第一個疑問是,為什麼正常的機器上,IP位置是127.255.0.0和127.255.0.1,後來查了文發現,原來現在的Azure SDK已經改成127.255.0.0和127.255.0.1的方式來區分不同的站台,而非以前用port來區分 ( 據說是1.5就改了,完全沒注意阿= =||| );另外,雖然站台的ip不同,但瀏覽器還是會顯示出127.0.0.1。

當發現這個問題,當然就是又驚又喜,想說已經查出問題,可以解決了,但實際上,根本沒那麼簡單QQ…

找到這個問題後,小弟我第一個想到的就是,既然是IIS Express的問題,那能不能從Visual Studio的建置過程Log,查到一點蛛絲馬跡,結果翻到眼睛快脫窗,終於找到這行,下圖可能沒有全部擷取到畫面,但細節大概是這樣。

Starting process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' with arguments '"C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\San.Sky\AppData\Local\dftmp\Resources\6413450b-a6af-4534-a5ae-9b3775b20072\temp\temp\RoleTemp\applicationHost.config" /site:"deployment18(23).WindowsAzure1.MvcWebRole1_IN_0_Web"'...
'WaIISHost.exe' (Managed (v4.0.30319)): 已載入 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll',並略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
Starting process 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\v1.8\Debugger\WindowsAzureDebugger.exe' with arguments '"C:\Program Files\IIS Express\iisexpress.exe" /trace:error /config:"C:\Users\San.Sky\AppData\Local\dftmp\Resources\4ef06da0-aee0-46cc-a10b-3fa06f73b6ef\temp\temp\RoleTemp\applicationHost.config" /site:"deployment18(23).WindowsAzure1.MvcWebRole1_IN_1_Web"'...

偵錯

所以可以上面看到,IIS Express的建置指令… ( Orz…也順便把IIS Express的建置過程給學會了… );而也從這邊看到,IIS Express的設定檔位置。

所以繼續追進去,把裡面的一些log看過一遍 ( 眼睛又脫窗了一次… ),這次,終於發現,設定檔有錯誤了!!如下圖。

applicationHost Error

正確的應該是長這樣。

applicationHost Correct

燈燈燈,所以可以發現,是在建置過程中,產生的設定檔發生錯誤;而為了證實,真的是這個設定檔的問題,我還把整個產生出的IIS Express設定拷貝一份,並且重新用IIS Express來Run一次,結果發現是可以的!!

後來我又把錯誤的設定檔用IIS Express跑一次,就產生了IIS Express的錯誤,所以,真正發生錯誤的點就是IIS Express的設定檔,而原因就是因為兩個站台用到同樣的IP和Port!! ( 我要用紅色字,代表我的激動XDD )。

所以我們來整理一下發生錯誤的原因,當Visual Studio開始偵錯的時候,會產生給IIS Express用的兩個設定檔,而不知道甚麼原因,設定檔的內容,都是指向port 81和localhost,所以用一個Instance起得來,但用兩個Instance,就會因為IP和Port相衝,而產生錯誤!!!

好,知道原因後,我懷疑是不是Azure SDK封裝Cloud Service的問題,但經過測試,和移到正常的機器測試等等,都沒有問題;所以可想而知!!!!

是的…我卡關了XDDDD

後來也是過了好幾個月後,問了Michael,後來Michael也查到一些資料,解法是要註冊碼去改值

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\10.0\SP的值改為10。

如下圖。

image

改完後,很神奇的,就沒發生了…,就這樣,雖然不知道原因,但至少解決了多年的困擾…

後記

後面連結,有給一些國外針對此問題的解法和看法,還有整個Azure模擬器的建置過程( 我還沒看就是了XDD,有空再來補成一篇 );當然,這個問題,有可能歸咎於小弟我安裝了過太多的Azure SDK,或是裝來裝去,裝了一堆的CTP、Beta、等等開發中版本,才發生這樣的問題,但這個過程還是滿有趣的,所以也在這邊記錄下來。

最後,過了半年,很多朋友也覺得我很神奇XDD,案發現場能保留那麼久…但說真的,我相信只要不放棄,就一定可以找到原因 ( 至少是解法~~ ),所以,如果有發現問題,也不要輕易放棄喔!! ( 其實是我懶得重灌= =… )

參考網址

沒有留言:

張貼留言