我在EWS UpdateItem中对ChangeKey使用什么?

时间:2020-03-06 14:53:35  来源:igfitidea点击:

我正在尝试使用Exchange Web服务更新日历项目。我正在创建一个ItemChangeType,然后一个ItemIdType。我有一个唯一的ID用于ItemIdType.Id,但是我没有任何可用于ChangeKey。当我忽略它时,我得到一个ErrorChangeKeyRequiredForWriteOperations。但是,当我尝试在其中放东西时,我得到一个ErrorInvalidChangeKey。

我可以用什么来使其正常工作?

我还试图确定要用于ItemChangeType.Item的BaseItemIdType的最佳实现。到目前为止,我正在使用ItemIdType,并且我猜这是正确的,但是我还没有找到关于此的任何特别有用的文档。

解决方案

如果我们拥有ItemIdType.Id属性,那么我们还应该可以访问Changekey,它也是ItemIdType的属性:

ItemIdType.ChangeKey

就像Id属性一样,它是一个字符串,因此在获取Id时就可以获取它。

问候
杰斯珀·豪格(Jesper Hauge)

在Hauge的答案上更明确一些:ChangeKey存储在Exchange中,用于标识项目的当前状态。对该项的任何更改都会创建一个新的ChangeKey。

这使Exchange可以"知道"更新已应用到与查看该项目以来相同的项目状态,因为我们检查该项目以来未对其进行更改。

一些代码可在以下位置找到:
http://msdn.microsoft.com/en-us/library/aa563020.aspx

如果仅知道ID,则可以轻松获取ChangeKey,例如文件夹:

private FolderIdType GetFullFolderID(string folderID)
  {
     GetFolderType request = new GetFolderType();
     request.FolderIds = new BaseFolderIdType[1];

     FolderIdType id = new FolderIdType();
     id.Id = folderID;
     request.FolderIds[0] = id;

     request.FolderShape = new FolderResponseShapeType();
     request.FolderShape.BaseShape = DefaultShapeNamesType.IdOnly;

     GetFolderResponseType response = _binding.GetFolder(request);

     FailOnError(response);

     FolderInfoResponseMessageType firmt = (FolderInfoResponseMessageType)response.ResponseMessages.Items[0];
     FolderType ft = (FolderType)firmt.Folders[0];
     id.ChangeKey = ft.FolderId.ChangeKey;

     return id;
  }

我建议我们使用Exchange托管API而不是Exchange Web服务来与Exchange一起工作。它更容易使用。我们可以在下面找到更多详细信息:

https://msdn.microsoft.com/zh-CN/library/dd877012(v=exchg.150).aspx