公司exchange环境升级到了2010 ,于是用以前的单元测试过了一遍,发现在创建没有邮件地址的时候居然报错,但是把环境改到了2007 却通过,通过工具Fiddler,发现差别如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Exchange2007<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="China Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SaveOnly">
<m:Items>
<t:Contact />
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Exchange2010<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="China Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SaveOnly">
<m:Items>
<t:Contact>
<t:EmailAddresses />
</t:Contact>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
明显多了一个 EmailAddresses 这个字段,经过反编译代码发现
原来现在这个字段已经是个对象了,所以在处理的时候会自动加上Emailaddressses。
怎么办呢?于是我想到一种办法,既然能在Exchange2010的服务器上采用2007的方式访问,而且是正常的,反而用2010 的方式访问不正常。那为了不干扰别的地方,我采用在局部地方采用原来2007 的访问方式,在程序实例化的时候,采用加载两种不同的服务,分别是当前版本和2007版本
代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
初始化 service = new ExchangeService(RequestedServerVersion)
{
Url = new Uri(config.EWSServiceUrl),
Credentials = new NetworkCredential(config.ExchangeAdministrator,
config.ExchangeAdministratorPassword,
config.Domain),
// ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SID, "MailAdmin")
};
service2007 = new ExchangeService( ExchangeVersion.Exchange2007_SP1)
{
Url = new Uri(config.EWSServiceUrl),
Credentials = new NetworkCredential(config.ExchangeAdministrator,
config.ExchangeAdministratorPassword,
config.Domain),
// ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SID, "MailAdmin")
};
在创建实体的时候均采用2007的方式(因为2010 可以兼容这个创建的方法)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
创建联系人 /// <summary>
/// 创建一个联系人实例,Contact实例不能通过new Contact的方式实例化
/// </summary>
/// <returns></returns>
public Contact CreateContactEntity()
{
Contact contact = new Contact(service2007);
return contact;
}
保存的代码被我改成如下
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
保存联系人 public string SaveContact2007(Contact data, string account)
{
var service1 = data.Service;
string mailAddress = string.Format("{0}@{1}", account, ConfigService.CreateInstance().MailDomain);
if (service1.ImpersonatedUserId == null || service1.ImpersonatedUserId.Id != mailAddress)
{
service1.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, mailAddress);
}
data.Save();
return data.Id.UniqueId;
}
这样,修改的方法亦是如此。