我一直致力于一个项目,允许人们通过网络浏览器在线访问他们的Outlook任务,并能够将这些任务标记为“完成”,而无需进入Outlook执行此操作。这是使用C#中的EWS实现的。
然而,有一个有趣的错误,如果您通过Web应用程序将任务标记为“完成”,并且如果您进入Outlook并尝试更新该任务的状态(例如将其标记为仍在进行中),则该任务仍然表现为被淘汰出局。
如果您直接从Outlook将任务标记为已完成,则会在列表中显示该任务的删除线,如果您“未完成”,则删除线将消失。对于从Web应用程序标记为已完成的任务,不会发生这种情况。
这是我用来将任务标记为完成的代码:
protected override bool ActionTask(ActionArgs data)
{
ConnectToServer();
//Create Identifier of task item to update
var itemId = new ItemIdType
{
Id = data.Id,
ChangeKey = GetChangeKey(data.Id) //Need to grab task's change key
};
//Create task item to hold a set update
var setStatusTask = new TaskType
{
Status = TaskStatusType.Completed,
StatusSpecified = true
};
//Create set update
var setItemField = new SetItemFieldType
{
Item = new PathToUnindexedFieldType(),
Item1 = setStatusTask
};
(setItemField.Item as PathToUnindexedFieldType).FieldURI = UnindexedFieldURIType.taskStatus;
//Create the update request.
UpdateItemType updateItemRequest = new UpdateItemType();
updateItemRequest.ItemChanges = new ItemChangeType[1];
var itemChange = new ItemChangeType()
{
Item = itemId,
Updates = new ItemChangeDescriptionType[1]
};
itemChange.Updates[0] = setItemField;
updateItemRequest.ItemChanges[0] = itemChange;
UpdateItemResponseType updateItemResponse = ExchangeServiceBinding.UpdateItem(updateItemRequest);
if (updateItemResponse.ResponseMessages.Items.Length > 0)
return (updateItemResponse.ResponseMessages.Items[0].ResponseClass == ResponseClassType.Success);
return false;
}
我不能为我的生活弄清楚我的代码中是否缺少某些内容,或者这只是一个奇怪的Outlook错误。
谢谢堆。 :)
答案 0 :(得分:1)
看起来您正在使用生成的代理来完成工作,并且使用EWS托管API(EWSMA)可以简化您的编码。要在EWSMA中将任务标记为已完成,只需使用以下代码。
// Bind to the existing task by using the ItemId.
// This method call results in a GetItem call to EWS.
Task task = Task.Bind(service, itemId);
// Update the Status of the task.
task.Status = TaskStatus.Completed;
// Save the updated task.
// This method call results in an UpdateItem call to EWS.
task.Update(ConflictResolutionMode.AlwaysOverwrite);
然后要取消填写,请更改以下行。
task.Status = TaskStatus.NotStarted;
我运行了这个并检查了Outlook中的输出。第一个代码块标记了该任务,并在Outlook中完成了删除线,第二个代码删除了删除线和完整的复选标记。
有关使用EWSMA的详细信息,请参阅Get started with EWS Managed API client applications。