上周开始一项工作,起因是因为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. 遇到问题,应先把问题搞清楚,做好测试记录,然后再定性分析,这次走了很多弯路,不要一头扎进网上资料中,而是要有思路,而后再做。

最新文章

  1. Silverlight及WPF中实现自定义BusyIndicator
  2. Markdown--PDF--PPT--Flash 工具链
  3. url如何传递参数
  4. [转] AOP面向切面编程
  5. java中的getClass()函数
  6. asp .net连接打开数据库初步
  7. git 设置和取消代理
  8. [JSOI2007]合金
  9. python生成器 获取 目录下文件
  10. maven 使用 国内镜像的方法 解决依赖下载慢
  11. Linux根据MAC地址自动设置IP
  12. python简说(二十九)线程,进程
  13. tile38 server 密码保护
  14. sql的一个查询,情景:a表中存在的数据,且在b表中不存在 (not in,not exists
  15. 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
  16. 启用lazyload插件,减少图片加载
  17. 解决CentOS7虚拟机无法上网并设置CentOS7虚拟机使用静态IP上网
  18. handsontable-utilities
  19. Html遮罩层的显示(主要在于样式设置)
  20. git 命令备忘

热门文章

  1. 「模拟赛20181025」御风剑术 博弈论+DP简单优化
  2. Julia体验 语言基础
  3. 【Leetcode】Jump Game
  4. Kibana6.2.x 插件理解
  5. ul li做横向导航栏例子
  6. day30 锁 队列
  7. MongoDB安装为windows服务
  8. c#之GDI简单实现代码及其实例
  9. my20_mysql的本地用户无法连接到数据库
  10. Vue循环中多个input绑定指定v-model