示例:使用Exchange Web服务获取日程表数据(C#)

Categories: Other
Tags: No Tags
Comments: 1 Comment
Published on: 2010 年 05 月 11 日

[原文作者]:Jasonz

[原文链接]:Sample: Get Calendar Data Using Exchange Web Services (C#)

     当有人问我的前任经理David Treadwell,他每天都要做的是什么。他的回答是“开会和删除电子邮件”。遗憾的是,我的生活也是如此。然而管理自己的时间总是富有挑战性的。我想确保我花了足够的时间在技术上,交流上,客户身上等。为了把这件事变得简单,我使用Exchange中的分类功能(Categorize)把会议分门别类(这些是我自定义的类别):

clip_image002[7]

    看一眼日程表,我就能知道即将参加的是哪种会议。但是我仍需要一种方法去了解每个月我是怎样利用时间的。有什么好方法可以从我参加的会议中收集所有的会议类别信息,并取得各类别的比率呢?本文就有一个这样的示例。

    有很多种方法可以获取你的日程表数据。既然是这样,那么做起来就十分简单:在指定月份中收集所有设置了会议类别的日程表项。还有更简单的方法,就是使用Exchange Web服务直接向服务端请求相关数据。演示这个方法的示例中包含一个库文件,它能够连接Exchange Web服务,收集日程表项,以及一个控制台程序,它提供了一种简单的方式来驱动程序逻辑。下图显示了示例代码中的所有构成(点击可放大图像):

clip_image004[10]

    这张关系图是通过Visual Studio Ultimate中的“生成依赖图”功能生成。这幅图剖析了两个二进制文件(TimeSpent.exe和TimeSpentLib.dll)内各个部分,因此我们可以看到示例中的所有相关信息。

    这里有一些可以看到Exchange Web服务相关代码的关键部分。首先是GetExchangeProxy方法,它使用ExchangeServiceBinding建立到Exchange服务端的连接。在示例里,我们使用集成的Windows安全设置,这样用户名和密码就不是必须的了(你也可以提供它们做为一个可选项):

clip_image006[5]

    另一个有趣的方法是BuildQueryFilter,它负责生成FindItemType过滤等级。FindItemType类允许你在服务器上构造一个查询用于查找我们所需要的数据。代码中建立了一系列参数来处理开始和结束日期间的日程表项。例如,这段代码设置了一个所有的日期应当大于或等于开始日期的过滤条件。

clip_image008

    另一段与此相类似的代码设置了一个小于或等于结束日期的过滤条件。最终这两个条件组合成一个And从句,相当于“>= start AND <=end”:

clip_image010

    一旦设置好过滤条件,我们就可以获得所有符合我们要求的日程表项。在示例中我将日程表项集合返回到CalendarItemList中,这样我们就可以在客户端中枚举日程表项。GetNextItem方法会将完整的日程表项(大约有100个字段)拆解成我们所关注的一小部分字段,然后将相关数据返回到CalendarItemData实例中。在日程表项中有很多的字段可以返回。如果你对示例中没有使用到的字段有兴趣的话,可以用DebugTraceCalItem方法获取完整的日程表项信息。

    现在这个控制台程序就变得相当简单:解析并验证所有的参数,连接到Exchange服务端,然后将每一个日程表项输出为CSV格式。为了重定向这些输出,可以把它们直接写入到文件中或显示到控制台中。这样做,你就可以很容易的在Excel中打开那个文件,并做诸如修改,创建图表,分析数据等操作。

    我已经在控制台程序项目中生成了一个演示Run方法核心逻辑的顺序图(点击可放大图像):

clip_image012

(使用VS Ultimate生成顺序图十分简单:只要把你的光标移到一个方法上,并点击右键,选择“生成顺序图”)

clip_image014

    现在,运行这个应用程序就十分简单了:

timespent /start:9/1/2009 /end:9/30/2009 /out:c:\temp\sept09.csv /mailpath:https://mydomain/ews/exchange.asmx

这里的“mydomain”指的是你Exchange服务端的地址。你能从Exchange管理员那里获得它。(这与你使用手机通过
无线接收的方式同步邮件所用到的地址非常像。)

你可以从MSDN下载Exchange SDK。同时你可以从这里获取完整的示例代码副本。

    享受它吧!

1 Comment - Leave a comment
  1. Werner Leigland说道:

    Awsome post and straight to the point. I am not sure if this is in fact the best place to ask but do you folks have any ideea where to get some professional writers? Thanks in advance :)

Leave a comment


Welcome , today is 星期六, 2017 年 03 月 25 日