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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

关于任务调度的思考

其实对于Celery来说,网络上的资源和文档其实还是比较匮乏的,能够坚持坐下来,能够维护起来这样一个项目,确实不易。

774
来自专栏aoho求索

Spring Cloud 服务第一次请求超时的优化

1. 问题背景 微服务网关netflix-zuul 介绍了微服务网关的使用。通过Spring Cloud组件构建的服务集群,在第一次请求网关时经常会出现time...

3615
来自专栏互联网大杂烩

海量数据解决方案

缓存:将从数据库中获取的结果暂时保存起来,在下次使用时无需重新到数据库中获取。 页面静态化:将程序最后生成的页面保存起来。

833
来自专栏张善友的专栏

深入浅出事件流处理NEsper(一)

    对实时信息分析和处理,常常需要客户应用程序的开发相应功能。一般地,这些功能需要提供以下的处理流程,分析获取的数据,筛选数据,提取出有用的信息,然后将其通...

1949
来自专栏Clive的技术分享

PHP高并发大流量常规处理

增加服务器,提升服务器性能; nginx负载均衡; php、html静态化; 优化mysql,优化索引,mysql查询缓存; 引入redis、memcache;...

3306
来自专栏北京马哥教育

三分钟看懂Nginx服务器的缓存原理和机制

作者:LifeIsButA_Span 来源: http://blog.csdn.net/lifeisbuta_span/article/details/7059...

3087
来自专栏大数据和云计算技术

Hadoop数据收集系统—Flume

syslogTcp(5440) | agentSink("localhost",35856)

1172
来自专栏架构师之路

缓存,并发更新的大坑?

《缓存,究竟是淘汰,还是修改?》发出后,有朋友提到,高并发的情况下,缓存的更新可能存在问题,今天简单聊聊这个话题。

942
来自专栏性能与架构

优秀的系统监控工具

下面介绍3个开源的主流监控工具 Nagios ? https://www.nagios.org/ Nagios 用于对服务器、网络、应用进行监控和告警,非...

3108
来自专栏GreenLeaves

Oracle 单实例数据库安装和real application clusters数据库安装的区别

 在想了解Oracle单实例数据可和RAC数据库前,请确保你已经知道了数据库和实例的关系,如果不了解,请参考Oracle 数据库实例和数据库。 单实例数据库模式...

1808

扫码关注云+社区