/ 中存储网

Exchange2010 创建没有邮件联系人的问题如何解决

2014-08-28 23:27:53 来源:中存储网

公司exchange环境升级到了2010 ,于是用以前的单元测试过了一遍,发现在创建没有邮件地址的时候居然报错,但是把环境改到了2007 却通过,通过工具Fiddler,发现差别如下:

以下是代码片段:
<?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>

以下是代码片段:
<?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版本

代码如下:

以下是代码片段:
    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 可以兼容这个创建的方法)

以下是代码片段:
/// <summary>
/// 创建一个联系人实例,Contact实例不能通过new Contact的方式实例化
/// </summary>
/// <returns></returns>
public Contact CreateContactEntity()
{
Contact contact = new Contact(service2007);
return contact;
}

保存的代码被我改成如下:

以下是代码片段:
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;
}

这样,修改的方法亦是如此。