Поделиться через


Удаление встреч из повторяющегося ряда с помощью EWS в Exchange

Узнайте, как удалять встречи из повторяющегося ряда с помощью управляемого API EWS или EWS в Exchange.

Управляемый API EWS или EWS можно использовать для удаления ряда встреч или собраний или только одного экземпляра серии. Процесс, используемый для удаления целого ряда, по сути, совпадает с процессом, используемым для удаления только одного вхождения. Вы используете те же методы управляемого API EWS или операции EWS, которые используются для удаления встречи или собрания одного экземпляра. Разница заключается в идентификаторе элемента, включенном в метод или операцию. Давайте начнем с изучения того, как оба сценария одинаковы.

Чтобы удалить повторяющийся ряд или одно вхождение в повторяющийся ряд, необходимо найти экземпляр или ряд, который требуется удалить, а затем вызвать соответствующий метод или операцию, чтобы удалить его. Хотя вы можете просто удалить любой тип встреч, мы рекомендуем поддерживать всех участников или организаторов в актуальном состоянии и отменять собрания, организованные пользователем, и отклонять собрания, которые пользователь не организовал.

Так чем же отличаются сценарии? Все дело в объекте Appointment , используемом для вызова метода (для управляемого API EWS) или идентификатора элемента, включенного в запрос на операцию (для EWS). Чтобы удалить весь ряд, вам потребуется объект Appointment или идентификатор элемента для повторяющегося образца. Чтобы удалить одно вхождение, вам потребуется объект Appointment или идентификатор элемента для вхождения.

Удаление повторяющейся встречи с помощью управляемого API EWS

В этом примере предполагается, что вы прошли проверку подлинности на сервере Exchange Server и получили объект ExchangeService под именем service. Параметр повторяющегося элемента является объектом Appointment для повторяющегося главного объекта или одного вхождения. Параметр deleteEntireSeries указывает, следует ли удалить весь ряд, в который входит повторяющийся элемент .

public static bool DeleteRecurringItem(ExchangeService service, Appointment recurringItem, bool deleteEntireSeries)
{
    Appointment appointmentToDelete = null;
    // If the item is a single appointment, fail.
    if (recurringItem.AppointmentType == AppointmentType.Single)
    {
        Console.WriteLine("ERROR: The item to delete is not part of a recurring series.");
        return false;
    }
    // Check the Appointment that was passed. Is it
    // an occurrence or the recurring master?
    if (recurringItem.AppointmentType == AppointmentType.RecurringMaster)
    {
        if (!deleteEntireSeries)
        {
            // The item is the recurring master, so deleting it will delete
            // the entire series. The caller indicated that the entire series
            // should not be deleted, so fail.
            Console.WriteLine("ERROR: The item to delete is the recurring master of the series. Deleting it will delete the entire series.");
            return false;
        }
        else
        {
            appointmentToDelete = recurringItem;
        }
    }
    else
    {
        if (deleteEntireSeries)
        {
            // The item passed is not the recurring master, but the caller
            // wants to delete the entire series. Bind to the recurring
            // master to delete it.
            try
            {
                appointmentToDelete = Appointment.BindToRecurringMaster(service, recurringItem.Id);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: {0}", ex.Message);
                return false;
            }
        }
        else
        {
            // The item passed is not the recurring master, but the caller
            // only wants to delete the occurrence, so just
            // delete the passed item.
            appointmentToDelete = recurringItem;
        }
    }
    if (appointmentToDelete != null)
    {
        // Remove the item, depending on the scenario. 
        if (appointmentToDelete.IsMeeting)
        {
            CalendarActionResults results;
            // If it's a meeting and the user is the organizer, cancel it.
            // Determine this by testing the AppointmentState bitmask for 
            // the presence of the second bit. This bit indicates that the appointment
            // was received, which means that someone sent it to the user. Therefore,
            // they're not the organizer.
            int isReceived = 2;
            if ((appointmentToDelete.AppointmentState & isReceived) == 0)
            {
                results = appointmentToDelete.CancelMeeting("Cancelling this meeting.");
                return true;
            }
            // If it's a meeting and the user is not the organizer, decline it.
            else
            {
                results = appointmentToDelete.Decline(true);
                return true;
            }
        }
        else
        {
            // The item isn't a meeting, so just delete it.
            appointmentToDelete.Delete(DeleteMode.MoveToDeletedItems);
            return true;
        }
    }
    return false;
}

Чтобы использовать этот пример, необходимо выполнить привязку к вхожданию или повторяющейся главной части и передать результирующий объект Appointment в метод . Помните, что при доступе к встречам с помощью класса CalendarView результирующие элементы являются отдельными вхождениями. И наоборот, если вы используете класс ItemView , результирующие элементы будут повторяющимися мастерами.

Удаление повторяющейся встречи с помощью EWS

Удаление повторяющегося ряда с помощью EWS аналогично удалению собрания с одним экземпляром. На самом деле запросы SOAP принимают тот же формат. Опять же, ключ — это идентификатор элемента, используемый в запросе. Если идентификатор элемента соответствует повторяющимся главному элементу, то весь ряд будет удален. Если идентификатор элемента соответствует одному вхождаемости, удаляется только это вхождение.

Примечание.

В приведенных ниже примерах кода атрибуты ItemId, ChangeKey и RecurringMasterId сокращены для удобства чтения.

В этом примере используется операция CreateItem с элементом CancelCalendarItem для отмены собрания, организатором которого является пользователь. Значение элемента ReferenceItemId указывает на отмену элемента и может быть идентификатором элемента повторяющегося главного элемента или одного вхождения.

<?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="Eastern Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SendAndSaveCopy">
      <m:Items>
        <t:CancelCalendarItem>
          <t:ReferenceItemId Id="AAMkADA5..." ChangeKey="DwAAABYA..." />
          <t:NewBodyContent BodyType="HTML">Cancelling this meeting.</t:NewBodyContent>
        </t:CancelCalendarItem>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

В этом примере используется операция CreateItem с элементом DeclineItem для отклонения собрания, для которого пользователь не является организатором. Как и в предыдущем примере, значение элемента ReferenceItemId указывает на отклонение элемента и может быть идентификатором повторяющегося главного элемента или одним вхождением.

<?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="Eastern Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SendAndSaveCopy">
      <m:Items>
        <t:DeclineItem>
          <t:ReferenceItemId Id="AAMkADA6..." ChangeKey="DwAAABYA..." />
        </t:DeclineItem>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

В этом примере используется операция DeleteItem для удаления одного вхождения встречи без участников. Удаляемое вхождение определяется элементом OccurrenceItemId , который создается на основе идентификатора элемента повторяющегося главного элемента и индекса вхождения.

<?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="Eastern Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:DeleteItem DeleteType="MoveToDeletedItems" SendMeetingCancellations="SendToAllAndSaveCopy">
      <m:ItemIds>
        <t:OccurrenceItemId RecurringMasterId="AAMkADA8..." InstanceIndex="3" />
      </m:ItemIds>
    </m:DeleteItem>
  </soap:Body>
</soap:Envelope>

Обратите внимание, что вы можете получить тот же результат, заменив элемент OccurrenceItemId элементом ItemId , который содержит идентификатор элемента вхождения, как показано ниже.

<m:ItemIds>
  <t:ItemId Id="AAMkADA7..." ChangeKey="DwAAABYA..." />
</m:ItemIds>

См. также