上週開始一項工做,原由是由於QA同事發現咱們開發的EAS hook不能在Exchange 2007 server上工做,而在Exchange 2010上能夠正常工做。web
環境對好比下:測試
1. Windows Server 2007 R2 Ent Sp1, Exchange 2007, IIS 7網站
2. Windows Server 2007 R2 Ent Sp1, Exchange 2010, IIS 7spa
操做系統,IIS版本均一致,只有Exchange版本不一樣,因爲hook直接與IIS有關,因此最初也令本身疑惑。可是hook的本質是http module,放置在IIS中Microsoft-Server-ActiveSync下的Module中,這是與Exchange有關的。Debug過程當中,一直沒有發現緣由,也從上週到如今,走了不少彎路。最後發現是與IIS中Application Pools中MSExchangeSyncAppPool的Managed pipeline mode有關。操作系統
1. Exchange 2007環境下,pipleline mode(管道模式)默認是Classic(經典模式),Classic模式容許工做的http module只是Native module,即用C++開發的httpmodule。這樣的開發方式體現了C++的優勢,運行效率更高,更好的利用內存以及管理資源,但同時帶來的缺點是相比於另外一種方式,Managed module的開發效率更高,即用C#語言開發。server
2. Exchange 2010環境下,pipleline mode(管道模式)默認是Integrated(集成模式),Integrated模式容許Native和Managed module同時工做。ip
這裏要注意的是,Classic和Integrated在web.config文件中httpmodule,httphandler的標籤是不一樣的。內存
另外網上有不少文章,說http module從Classic模式向Integrated模式下轉換時,改變web.config文件中標籤就能使http module工做,可是通過我測試,這種方法是不行的。一種是Native方式開發,一種是託管代碼,不能僅經過修改配置文件使其適應Classic與Integrated。因此我以爲Managed module方式開發的http module就只能在Integrated模式下工做。資源
這也就是爲何咱們產品的hook不能在Exchange 2007環境下工做,由於Exchange 2007影響下,IIS的MSExchangeSyncAppPool默認模式是Classic,而咱們的hook是使用Managed方式開發的,僅適合Integrated模式。開發
那若是咱們把Exchange 2007的IIS MSExchangeSyncAppPool由Classic改成Integrated後,咱們的hook是否可否工做呢?
答案是不能!
由於
1. 通過測試發現,Exchange 2007僅在Classic模式下(默認),Active Sync才能工做,這時手機等設備才能鏈接至Exchange Server,才能從郵箱Sync郵件。而Exchange 2010僅在Integrated模式(默認)下,Active Sync才能工做。若是Active Sync不能工做,那咱們的hook原本就是作Sync郵件時起做用,確定不能工做。
2. 從客戶的角度,若是客戶的IIS配置是默認的,咱們的產品不該該去手動修改它,這樣潛在可能形成損失,因此不能這樣作!
所以得出結論,針對於Active Sync的http module,在Exchange 2007環境下,只能採用Native的方式開發,即C++開發;Exchange 2010即以上版本環境下,只能用Managed的方式開發,即C#方式。固然這裏討論的只針對於Active Sync。
因此下一步的工做,我將會用Native(C++)的方式來開發EAS hook(本質是httpmodule),到時開發的心得總結會及時記錄在這裏!:-)
獲得的經驗教訓:
1. 網上查資料,涉及技術的不少知識仍是應查英文資料,例如msdn等網站。
2. 遇到問題,應先把問題搞清楚,作好測試記錄,而後再定性分析,此次走了不少彎路,不要一頭扎進網上資料中,而是要有思路,然後再作。