Active Sync与IIS7 Classic&Integrated模式,Exchange 2007&2010的关系
上周开始一项工作,起因是因为QA同事发现我们开发的EAS hook不能在Exchange 2007 server上工作,而在Exchange 2010上可以正常工作。
环境对比如下:
1. Windows Server 2007 R2 Ent Sp1, Exchange 2007, IIS 7
2. Windows Server 2007 R2 Ent Sp1, Exchange 2010, IIS 7
操作系统,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#语言开发。
2. Exchange 2010环境下,pipleline mode(管道模式)默认是Integrated(集成模式),Integrated模式允许Native和Managed module同时工作。
这里要注意的是,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. 遇到问题,应先把问题搞清楚,做好测试记录,然后再定性分析,这次走了很多弯路,不要一头扎进网上资料中,而是要有思路,而后再做。