Удаление встреч и отмена собраний с помощью EWS в Exchange
Узнайте, как удалять встречи и собрания с помощью управляемого API EWS или служб EWS в Exchange.
Существенное различие между собраниями и встречами состоит в том, что на собраниях есть участники, а на встречах — нет. Встречи и собрания могут быть одиночными экземплярами или принадлежать к повторяющейся последовательности, но так как встречи не включают участников, комнаты и ресурсы, для них не требуется отправлять сообщение. Exchange использует внутри один и тот же объект как для собраний, так и для встреч. Для работы с собраниями и встречами используется класс Appointment API EWS или элемент EWS [CalendarItem](https://msdn.microsoft.com/library/Title Topic ID Project Name Writer Editor Publish Preview.aspx).
Таблица 1. Методы управляемого API EWS и операции EWS для удаления встреч и собраний
Метод управляемого API EWS | Операция EWS | Действие |
---|---|---|
Appointment.Delete |
DeleteItem |
Удаление встречи. |
Appointment.Delete |
CreateItem (элемент календаря) |
Удаление собрания. |
Обратите внимание, что при удалении встреч с помощью EWS используется операция DeleteItem, а при удалении собраний — операция CreateItem. Такой принцип может казаться нелогичным, но причина в том, что необходимо создать объект ответа на собрание, чтобы отправить участникам сообщения об отмене собрания.
Удаление встречи с помощью управляемого API EWS
В следующем примере кода показано использование метода Delete для удаления встречи из папки календаря, а также использование метода ExchangeService.FindItems, чтобы убедиться, что встреча была удалена, путем поиска этой встречи в папке "Удаленные элементы".
В этом примере предполагается, что вы прошли проверку подлинности на сервере Exchange Server и получили объект ExchangeService под именем service. Локальная переменная appointmentId
— это идентификатор, связанный с существующей встречей.
// Instantiate an appointment object by binding to it by using the ItemId.
// As a best practice, limit the properties returned to only the ones you need.
Appointment appointment = Appointment.Bind(service, appointmentId, new PropertySet());
// Delete the appointment. Note that the item ID will change when the item is moved to the Deleted Items folder.
appointment.Delete(DeleteMode.MoveToDeletedItems);
// Verify that the appointment has been deleted by looking for a matching subject in the Deleted Items folder's first entry.
ItemView itemView = new ItemView(1);
itemView.Traversal = ItemTraversal.Shallow;
// Just retrieve the properties you need.
itemView.PropertySet = new PropertySet(ItemSchema.Id, ItemSchema.ParentFolderId, ItemSchema.Subject);
// Note that the FindItems method results in a call to EWS.
FindItemsResults<Item> deletedItems = service.FindItems(WellKnownFolderName.DeletedItems, itemView);
Item deletedItem = deletedItems.First();
Folder parentFolder = Folder.Bind(service, deletedItem.ParentFolderId, new PropertySet(FolderSchema.DisplayName));
Console.WriteLine("The appointment " + "\"" + deletedItem.Subject + "\"" + " is now in the " + parentFolder.DisplayName + " folder.");
В этом примере показан простой способ проверки удаления встречи: проверяется совпадение темы первого элемента в папке "Удаленные элементы" с темой удаленной встречи. Выбор способа проверки удаления встречи зависит от потребностей приложения.
Как видите, процесс удаления встречи устроен просто и логично. Обратите внимание, что при создании этапа проверки наличия элемента встречи в папке "Удаленные элементы" идентификатор элемента будет отличаться от используемого в случае, когда элемент встречи находится в папке календаря. Элемент копируется и удаляется, а не просто перемещается в папку "Удаленные элементы".
Удаление встречи с помощью EWS
XML-код запроса и отклика в следующих примерах соответствует вызовам, которые выполняются кодом управляемого API EWS в разделе Удаление встречи с помощью управляемого API EWS. Также отображается XML-код запроса и отклика, подтверждающего наличие элемента встречи в папке "Удаленные элементы".
В следующем примере показан XML-код запроса операции DeleteItem для удаления встречи.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Pacific Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:DeleteItem DeleteType="MoveToDeletedItems" SendMeetingCancellations="SendToAllAndSaveCopy">
<m:ItemIds>
<t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
</m:ItemIds>
</m:DeleteItem>
</soap:Body>
</soap:Envelope>
В следующем примере показан XML-код отклика, возвращаемого операцией DeleteItem. Атрибуты ItemId и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:DeleteItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:DeleteItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
</m:DeleteItemResponseMessage>
</m:ResponseMessages>
</m:DeleteItemResponse>
</s:Body>
</s:Envelope>
В следующем примере показан XML-код запроса для операции FindItem, которая извлекает первый элемент в папке "Удаленные элементы", чтобы сравнить тему элемента с темой объекта удаленной встречи.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Pacific Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:FindItem Traversal="Shallow">
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:ItemId" />
<t:FieldURI FieldURI="item:ParentFolderId" />
<t:FieldURI FieldURI="item:Subject" />
</t:AdditionalProperties>
</m:ItemShape>
<m:IndexedPageItemView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" />
<m:ParentFolderIds>
<t:DistinguishedFolderId Id="deleteditems" />
</m:ParentFolderIds>
</m:FindItem>
</soap:Body>
</soap:Envelope>
В следующем примере показан XML-код отклика, возвращаемого операцией FindItem на этапе проверки.
Примечание.
Атрибуты ItemId и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder IndexedPagingOffset="1" TotalItemsInView="10748" IncludesLastItemInRange="false">
<t:Items>
<t:CalendarItem>
<t:ItemId Id="AAMkA=" ChangeKey="DwAAA" />
<t:ParentFolderId Id="AAMkA" ChangeKey="AQAAA" />
<t:Subject>Tennis lesson</t:Subject>
</t:CalendarItem>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
</m:FindItemResponse>
</s:Body>
</s:Envelope>
Удаление собрания с помощью управляемого API EWS
При удалении собрания можно не только удалить элемент встречи из папки календаря, но и отправить участникам сообщения об отмене собрания. Чтобы отменить собрание, можно использовать следующие три метода:
Выбор метода зависит от уровня детализации, который необходимо предоставить в сообщении об отмене. Метод Appointment.CancelMeeting упрощает обновление сообщения об отмене путем передачи обновленного сообщения в виде параметра. Метод CancelMeetingMessage позволяет изменять свойства сообщения перед отправкой отмены, чтобы можно было запросить уведомление о прочтении.
В примерах кода в этом разделе показаны различные способы удаления собрания и отправки сообщений об отмене собрания. В этих примерах предполагается, что вы прошли проверку подлинности на сервере Exchange Server и получили объект ExchangeService под именем service. Локальная переменная meetingId
— это идентификатор, связанный с существующим собранием, организатором которого является целевой пользователь.
В следующем примере кода показано, как удалить собрание с помощью метода Appointment.Delete.
// Instantiate an appointment object for the meeting by binding to it using the ItemId.
// As a best practice, limit the properties returned to only the Appointment ID.
Appointment meeting = Appointment.Bind(service, meetingId, new PropertySet());
// Delete the meeting by using the Delete method.
meeting.Delete(DeleteMode.MoveToDeletedItems, SendCancellationsMode.SendToAllAndSaveCopy);
// Verify that the meeting has been deleted by looking for a matching subject in the Deleted Items folder's first entry.
ItemView itemView = new ItemView(1);
itemView.Traversal = ItemTraversal.Shallow;
// Just retrieve the properties you need.
itemView.PropertySet = new PropertySet(ItemSchema.Id, ItemSchema.ParentFolderId, ItemSchema.Subject);
// Note that the FindItems method results in a call to EWS.
FindItemsResults<Item> deletedItems = service.FindItems(WellKnownFolderName.DeletedItems, itemView);
Item deletedItem = deletedItems.First();
Folder parentFolder = Folder.Bind(service, deletedItem.ParentFolderId, new PropertySet(FolderSchema.DisplayName));
Console.WriteLine("The meeting " + "\"" + deletedItem.Subject + "\"" + " is now in the " + parentFolder.DisplayName + " folder.");
В следующем примере кода показано, как удалить собрание с помощью метода CancelMeeting.
// Instantiate an appointment object by binding to it using the ItemId.
// As a best practice, limit the properties returned to only the Appointment ID.
Appointment meeting = Appointment.Bind(service, meetingId, new PropertySet());
// Delete the meeting by using the CancelMeeting method.
meeting.CancelMeeting("The outdoor meeting has been cancelled due to hailstorms.");
В следующем примере кода показано, как удалить собрание с помощью метода Appointment.CreateCancelMeetingMessage.
// Instantiate an appointment object by binding to it using the ItemId.
// As a best practice, limit the properties returned to only the Appointment ID.
Appointment meeting = Appointment.Bind(service, meetingId, new PropertySet());
// Delete the meeting by using the CreateCancelMeetingMessage method.
CancelMeetingMessage cancelMessage = meeting.CreateCancelMeetingMessage();
cancelMessage.Body = new MessageBody("The outdoor meeting has been canceled due to hailstorms.");
cancelMessage.IsReadReceiptRequested = true;
cancelMessage.SendAndSaveCopy();
Удаление собрания с помощью EWS
XML-код запроса и отклика в следующих примерах соответствует вызовам, выполняемым кодом управляемого API EWS в разделе Удаление собрания с помощью управляемого API EWS методом Appointment.Delete.
В следующем примере показан XML-код запроса при использовании операции CreateItem для отправки сообщений об отмене участникам и для удаления собрания.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Pacific Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SendAndSaveCopy">
<m:Items>
<t:CancelCalendarItem>
<t:ReferenceItemId Id="AAMkA" ChangeKey="DwAAA" />
<t:NewBodyContent BodyType="HTML">The outdoor meeting has been canceled due to hailstorms.</t:NewBodyContent>
</t:CancelCalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
В следующем примере показан XML-код, возвращаемый в ответ на запрос операции CreateItem, используемый для удаления собрания.
Примечание.
Атрибуты ItemId и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:CreateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
</t:CalendarItem>
</m:Items>
</m:CreateItemResponseMessage>
</m:ResponseMessages>
</m:CreateItemResponse>
</s:Body>
</s:Envelope>
В следующем примере показан XML-код запроса для операции FindItem, которая извлекает первый элемент в папке "Удаленные элементы", чтобы сравнить тему элемента с темой объекта удаленной встречи.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Pacific Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:FindItem Traversal="Shallow">
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:ItemId" />
<t:FieldURI FieldURI="item:ParentFolderId" />
<t:FieldURI FieldURI="item:Subject" />
</t:AdditionalProperties>
</m:ItemShape>
<m:IndexedPageItemView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" />
<m:ParentFolderIds>
<t:DistinguishedFolderId Id="deleteditems" />
</m:ParentFolderIds>
</m:FindItem>
</soap:Body>
</soap:Envelope>
В следующем примере показан XML-код, возвращаемый операцией FindItem на этапе проверки.
Примечание.
Атрибуты Id и ChangeKey сокращены для удобства чтения.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="800" MinorBuildNumber="5" Version="V2_6"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder IndexedPagingOffset="1" TotalItemsInView="10750" IncludesLastItemInRange="false">
<t:Items>
<t:CalendarItem>
<t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
<t:ParentFolderId Id="AAMkA" ChangeKey="AQAAA" />
<t:Subject>Team building exercise</t:Subject>
</t:CalendarItem>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
</m:FindItemResponse>
</s:Body>
</s:Envelope>
Дополнительные ресурсы
- Календари и веб-службах Exchange
- Создание встреч и собраний с помощью EWS в Exchange 2013
- Получение встреч и собраний с помощью EWS в Exchange
- Обновление встречи и собрания с помощью веб-служб Exchange в Exchange
- Предложение нового времени собрания с помощью EWS в Exchange
- Предложение нового времени собрания с помощью EWS в Exchange