代码改变世界

Office Communicator 2007定制开发展示

2008-10-14 09:08  Windie Chai  阅读(5723)  评论(22编辑  收藏  举报
前段时间做了不少Office Communicator 2007的定制开发,主要内容包括组织人员树、聊天记录以及与其它通讯方式的结合(比如手机短信和邮件)。组织人员树仿佛是国内办公领域亘古不变的需求,而Office Communicator 2007默认并不支持多级分组,所以只能定制开发。
第一版,我使用了普通的ASP.NET页面作为组织结构树的宿主,并将其添加到Office Communicator 2007的标签页中,该组织结构支持向单个用户、用户组以及多个用户发送消息。效果如下:

组织结构树中显示人员的Office Communicator状态是依靠Office中的NameCtrl完成的,具体方法请参见《使用NameCtrl为网页集成Office Communicator状态信息》。

但不知道是NameCtrl的bug,还是Office Communication Server 2007的限制,总会随机地出现某些用户的状态始终无法返回的情况,于是我使用ActiveX开发了第二版,效果如下:
第二版很大程度上参考了微软的“Microsoft Office Communicator 2007 Presence Controls”,人员的状态信息本来也已经实现,可是仍然像第一版一样不太稳定,于是以上截图中并不包含人员的状态信息。
在第一版中,与其他通讯方式的结合是通过浏览器弹出窗口来完成的,而第二版采用了ActiveX技术后,弹出WinForm窗体已是不可能,于是仿照流行的网页“遮罩对话框”效果实现了一种位于控件内的对话框。
这个对话框可以在其内部显示任何用户控件,并在显示的同时禁用ActiveX的其它部分,而且它还公开了对话框关闭事件,以便点击用户控件的某一按钮(比如“发送”)时关闭对话框。这个对话框的效果如下:

总结一下两种方式的优劣吧。

对于纯ASP.NET来说,是很复杂的,因为它是纯B/S架构,用UCMA等API来订阅用户的状态显然不现实,而NameCtrl又会出现状态无法返回的问题(当然,这个也有可能是我这边的个别现象)。抛开用户状态,想要获得很好的用户体验,开发人员不得不采用JavaScript来控制组织人员树和一些行为,而Office Communicator 2007对标签页中的HTML内容是有一定限制的,这会让开发人员的排错非常痛苦。
对于ActiveX来说,完全可以使用API来订阅状态,而不用担心页面刷新的问题,而且组织人员树这种控件也非常容易实现。但因为它是客户端应用程序,所以与其它系统的集成可能需要借助Web Services来完成,这样做虽然增加了少许不便,但也使得应用程序不再紧密耦合,所以这也是我个人推荐的方法。

源码涉及到商业机密,就不提供了,有需求的朋友可以参考“Microsoft Office Communicator 2007 Presence Controls”,事实上这个示例已经完成了大部分功能了。