癥狀
公司一台資料庫伺服器上部署了IIS網站(IIS7),利用Sql Server Analysis Services的msmdpump.dll組件,實現了通過HTTP層來訪問Analysis Services(MSAS不支援HTTP遠端存取,非HTTP的遠端存取也一直沒成功過)。健全狀態一直良好,最近突然罷工。Debug發現在建立串連的時候總是拋出“The Connection either timed out or was lost”。
診斷
嘗試用企業管理器直接連接Analysis Services,成功,資料訪問也正常,說明Analysis Services服務運作正常。那看來問題是出在了IIS這一層。
直接在瀏覽器中通過http://machinename/olap/msmdpump.dll去訪問的時候,會彈出一個儲存檔案的對話方塊。正常情況下,伺服器會返回500,因為沒有資料輸入。現在彈出儲存檔案的對話方塊,說明IIS把這個dll資源當作一個普通檔案來對待了,而不是調用ISAPI處理器來處理。
細看了網站的配置,似乎沒有問題,重新部署了一個網站,重新設定了ISAPI處理器映射,問題依舊出現。
自己探索了很久,未果,Google了很久,一篇文章(IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes)提醒了我。這篇文章講的是如何在不同的應用程式集區進程上同時使用32位和64位的Asp.Net。
公司伺服器出於效能考慮,用了64位系統。相應的msmdpump.dll檔案也是64位的,但IIS的應用程式集區進程是多少位的,我倒還真沒考慮過。工作管理員一看,只有一個"w3wp.exe * 32”,果然是32位的。那問題的原因應該是,32位的應用程式集區無法載入64位的Isapi處理器。
知道了問題所在,解決方案也很簡單,啟動一個64位的應用程式集區就行了。開啟應用程式集區的進階設定,找到了“啟用32位應用程式(enable32bitAppOnWin64)”的設定,將其從原來的True改成False(預設值為False)。這個選項的作用就是允許在64位作業系統上,以32位的應用程式集區去載入32位的程式。
之所以會突然出現這個問題,是因為IIS的機器設定檔ApplicationHost.config檔案中,全域應用程式集區的enable32bitAppOnWin64預設值被意外修改為True。而我部署的IIS網站,由於沒有顯式設定此選項,因此會繼承ApplicationHost.config檔案中的預設值。
——Kevin Yang