不能"#34;未完成"通过EWS标记为已完成的Outlook任务

时间:2014-05-02 05:46:39

标签: c# outlook exchangewebservices

我一直致力于一个项目,允许人们通过网络浏览器在线访问他们的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错误。

谢谢堆。 :)

1 个答案:

答案 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