因为项目的需要,要与Exchange Server 2007进行整合,就学习了一下EWS(Exchange Web Service),以下是学习过程中的学习笔记。
刚开始学习,就在网上搜索关于这方面的内容,发现了一篇不错的入门文章,推荐给大家。
作者:IT168 耿锐丽 2007-09-06
Exchange Server2007 已经面市将近一年了,相信大家一定对它的强大功能已经有所体验了,其中值得我们关注的就是Exchange Server 2007将web service的应用开发引入到CAS(Client Access Server)中,给开发人员带来了福音。现在就让我们一起来学习一下Exchange Server 2007 Web Service的新特性和它的二次开发的相关技术吧。
一、 Exchange Server 2007 Web Service新特性
用Web Service将存储访问进行了整合:早期对Exchange Server进行开发,需要了解和掌握许多技术和协议,比如CDO,WebDav以及OWA URL命令,现在Web Service将这些复杂的技术协议进行了整合和替换。
对于消息,日程安排,联系人等提供了强类型对象:Exchange Web Service(EWS)中调用的对象和数据类型都是通过WSDL(Web Service Define Language)来定义和描述的,每种数据类型都是强类型的对象,这对于开发来说是非常好的特性。
与微软的visual studio及.net framework进行了有效地整合:开发人员能够利用C# 或 VB.NET 等开发语言建立自定义的应用系统。企业可以使用这些应用系统来执行消息通信环境中的一般管理任务。
提供了一些新的API函数来获得Exchange server2007 CAS的数据:开发人员可以从任何客户端、语言或平台调用这些API,将Exchange Server 2007 邮箱或日历中的信息插入商业或其他自定义应用系统。
提供远程的访问:例如早期我们开发了Exchange Server的某个应用,那么我们就需要将其部署到Exchange Server上,但一般来说开发人员和系统管理员分属不同的部门和人员,所以这种部署必须得到系统管理员的允许,也许还需要开放一些额外的防火墙端口。现在如果是用Web Service开发的应用,我们就可以将其放在任何一台计算机上而无需专门部署到Server上。
通过Exchange Business Logic Layer可以灵活地与Outlook 进行交互。
二、 为什么要使用Web Service
我们都知道利用Web Service进行开发具有非常好的扩展性,Web Service允许在不同平台上、以不同语言编写的各种程序以基于标准的方式相互通信。微软在Exchange Server2007中引入Web Service也是大势所趋。Exchange Server2003 以前的很多应用是很难跨过内网的限制,比如说用于存储访问的API主要目的是获取和管理邮件,日程安排及用户属性等信息,对于开发人员来说如果要操作这些信息,只能利用MAPI或CDO1.2.1来开发应用程序。而对于开发外网的应用也只可以利用WebDAV,熟悉WebDAV的人都知道它也是OWA2000和OWA2003广泛使用的协议,但WebDAV从开发难度大,整个开发成本相对比较大,由此可见在Exchange Server2003或更早期,如果要对Exchange Server进行二次开发是非常难的事,开发人员需要区分应用程序是应用到内部网络还是外部网从而选择相应的开发方式,这就要求开发人员必须熟悉很多协议和API接口。现在应用Exchange Web Service进行开发不但降低开发应用程序的难度同时也打破了网络限制,我们可以将Exchange Web Service理解为就是一个Exchange Server二次开发的接口,这个接口可以让我们的程序运行在80 或443接口之上,利用这个接口开发的应用程序无需再考虑是在内部网络部署还是在Internet上部署,这样就可以更灵活地管理Exchange Server组织结构并调用邮箱或用户等信息。
三、 如何利用Exchange Server 2007 Web Service进行二次开发
Exchange Web Service API 工作流程
Exchange Server 2007 web service也是基于标准的Web Service实现原理的:HTTP/XML/SOAP/WSDL 基于这种标准的实现,我们就能很容易地理解Exchange Web service API 工作流程:它是一种基于客户端访问/服务器端响应的方式,通过这种响应来完成数据传输,功能执行,消息提醒等功能。
当客户端要发送一个请求或执行一个操作时,首先需要将所要执行的操作构建成XML元素,接下来就需要对XML的传输创建一个SOAP消息,创建完SOAP消息以后,就需要对XML消息进行序列化,以便于通过HTTP协议进行传输,然后作为一个请求进行发送,客户端发送请求以后就会被服务器接受,服务器接受以后就会执行相应的操作,解除序列化,提取出XML的信息,按照客户端的要求执行操作。最后会将执行的结果作为响应发送回客户端,客户端会执行与服务端相同的操作,解除序列化,提取XML消息。
开发前的环境部署
正如我们前面所提到的,Exchange Web Service是应用在CAS上的,因此我们需要一台装有Exchange server2007 Client Access(客户端访问)角色的服务器,来引用EWS。在这台服务器上我们可以从IIS的默认网站下面找到虚拟目录EWS。在这个虚拟目录下面主要有以下几个文件:
Services.wsdl:描述客户端和服务器之间的约定。
Messages.xsd:定义请求和响应的SOAP。
Types.xsd:定义了在Soap消息中使用的元素。
Exchange.asmx:定义了EWS的Web引用。
编写一个Web Service的应用一般分为四个步骤:
(1)创建代理对象引用参考。
在Visual Stadio 2005 中,当我们建立完一个新的工程后,就可以为这个工程添加一个Web引用,我们在这里引用的就是一台装有Client Access 角色的服务器上的EWS虚拟目录下的Services.wsdl文件。
(2)设置ExchangeServiceBinding代理类。
完成Web引用后,我们就可以用以下的语句来完成Service的绑定。
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential("administrator", "J$p1ter", " DFQVPI-dom");
esb.Url = "https://bjextest043/EWS/exchange.asmx";
(3)创建并调用操作。
CreateItemType createEmailRequest = new CreateItemType();
MessageType message = new MessageType();
message.Subject = "Mail Test";
createEmailRequest.Items.Items = new ItemType[1];
createEmailRequest.Items.Items[0] = message;
(4) 发送请求并处理响应。
CreateItemResponseType createItemResponse = esb.CreateItem(createEmailRequest);
接下来我们就以为用户创建邮件信息应用为例,向大家全面地展示一下如何利用Exchange Web Service进行二次开发。
private void SendMail(ExchangeServiceBinding esb)
{
//创建 CreateItem 的请求
CreateItemType createEmailRequest = new CreateItemType();
//确定 Mail的处理方式
createEmailRequest.MessageDisposition = MessageDispositionType.SendAndSaveCopy;
createEmailRequest.MessageDispositionSpecified = true;
//确定发送信息存放的位置
createEmailRequest.SavedItemFolderId = new TargetFolderIdType();
DistinguishedFolderIdType sentitmes = new DistinguishedFolderIdType();
sentitmes.Id = DistinguishedFolderIdNameType.sentitems;
createEmailRequest.SavedItemFolderId.Item = sentitmes;
//创建存放数组
createEmailRequest.Items = new NonEmptyArrayOfAllItemsType();
//创建 e-mail 信息
MessageType message = new MessageType();
message.Subject = "Mail Test";
message.Body = new BodyType();
message.Body.BodyType1 = BodyTypeType.Text;
message.Body.Value = "TOoo Busy!!!!.";
message.Sender = new SingleRecipientType();
message.Sender.Item = new EmailAddressType();
message.Sender.Item.EmailAddress = "[email protected]";
message.ToRecipients = new EmailAddressType[1];
message.ToRecipients[0] = new EmailAddressType();
message.ToRecipients[0].EmailAddress = Receiver;
message.Sensitivity = SensitivityChoicesType.Normal;
createEmailRequest.Items.Items = new ItemType[1];
createEmailRequest.Items.Items[0] = message;
try
{
// 创建绑定
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential("administrator", "J$p1ter", " DFQVPI-dom");
esb.Url = "https://bjextest043/EWS/exchange.asmx";
//发送CreateItem的请求
CreateItemResponseType createItemResponse = esb.CreateItem(createEmailRequest);
ArrayOfResponseMessagesType responseMessages = createItemResponse.ResponseMessages;
}
catch (Exception ex)
{
throw new Exception("Warning: " + ex.Message);
}
}
Exchange Web Service是一个新的开发技术,在未来的日子它会得到更效地发展和完善,如果大家有兴趣的话可以尽早投入到这项新技术中,经过自己的实践与思考,定会成为这项新技术的专家。