两个需要熟悉的概念:Operations(操作),Proxy Objects 代理对象
在Exchange Web Service进行开发前,我们需要理解Operations(操作),Proxy Objects (代理对象)这两个基本概念:
Operation(操作):Exchange 2007提供了29个操作(Operations),操作是指Exchange Server允许客户端所能执行的动作,它们对应于29个由客户端访问服务器所提供的.net web方法。
例如:CreateItem 操作,利用这个操作我们可以创建日程安排、邮件信息、会议请求以及联系人。
Proxy Object(代理对象):一般来说客户端在发出调用请求时并不是直接构造XML这样的数据结构,我们更喜欢采用对象模型的方式来对Exchange Server进行操作,Proxy在这里就是一个对象模型,它提供了Web Service的访问接口,通过这个访问接口,我们就可以对这些对象进行操作,比如设置属性,方法,然后Proxy(对象代理)又会将我们对这些对象的操作转化成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的绑定。
(3)创建并调用操作。ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Credentials = new NetworkCredential("administrator", "J$p1ter", " DFQVPI-dom");
esb.Url = "https://bjextest043/EWS/exchange.asmx";
(4) 发送请求并处理响应。CreateItemType createEmailRequest = new CreateItemType();
.
.
.
MessageType message = new MessageType();
message.Subject = "Mail Test";
.
.
.
createEmailRequest.Items.Items = new ItemType[1];
createEmailRequest.Items.Items[0] = message;
接下来我们就以为用户创建邮件信息应用为例,向大家全面地展示一下如何利用Exchange Web Service进行二次开发。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 = "Administrator@DFQVPI-dom.extest.microsoft.com";
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);
}
}