Compartilhar via


Excluir compromissos em uma série recorrente usando o EWS no Exchange

Saiba como excluir compromissos em uma série recorrente usando a API Gerenciada do EWS ou o EWS no Exchange.

Você pode usar a API Gerenciada do EWS ou o EWS para excluir uma série de compromissos ou reuniões ou apenas uma instância da série. O processo que você usa para excluir uma série inteira é essencialmente o mesmo que o processo que você usa para excluir apenas uma única ocorrência. Você usa os mesmos métodos de API Gerenciada do EWS ou operações EWS que você usa para excluir um único compromisso ou reunião de instância. A diferença está na ID do item incluída no método ou na operação. Vamos começar analisando como ambos os cenários são iguais.

Para excluir uma série recorrente ou uma única ocorrência em uma série recorrente, você precisa encontrar a ocorrência ou série que deseja excluir e, em seguida, chamar o método ou operação apropriado para removê-la. Embora você possa simplesmente excluir qualquer tipo de compromisso, recomendamos manter todos os participantes ou o organizador atualizados e cancelar reuniões que o usuário organizou e recusar reuniões que o usuário não organizou.

Então, como os cenários são diferentes? É tudo sobre o objeto Appointment usado para invocar o método (para a API Gerenciada do EWS) ou a ID do item incluída na solicitação de operação (para EWS). Para excluir uma série inteira, você precisa do objeto Appointment ou ID do item para o mestre recorrente. Para excluir uma única ocorrência, você precisa do objeto Appointment ou ID do item para a ocorrência.

Excluir um compromisso recorrente usando a API Gerenciada do EWS

Este exemplo pressupõe que você se autenticou em um servidor Exchange e adquiriu um objetoExchangeService chamado service. O parâmetro recorrenteItem é um objeto Appointment para o mestre recorrente ou uma única ocorrência. O parâmetro deleteEntireSeries indica se deve excluir toda a série da qual o recorrenteItem faz parte.

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;
}

Para usar este exemplo, você precisa se associar a uma ocorrência ou ao mestre recorrente e passar o objeto Appointment resultante para o método. Tenha em mente que, se você acessar compromissos usando uma classe CalendarView , os itens resultantes serão todas ocorrências individuais. Por outro lado, se você usar a classe ItemView , os itens resultantes serão todos mestres recorrentes.

Excluir um compromisso recorrente usando o EWS

Excluir uma série recorrente usando o EWS é o mesmo que excluir uma reunião de instância única. Na verdade, as solicitações SOAP tomam o mesmo formato. Novamente, a chave é a ID do item usada na solicitação. Se a ID do item corresponder ao mestre recorrente, toda a série será excluída. Se a ID do item corresponder a uma única ocorrência, somente essa ocorrência será excluída.

Observação

Nos exemplos de código a seguir, os atributos ItemId, ChangeKey e RecurringMasterId são abreviados para legibilidade.

Este exemplo usa a operação CreateItem com um elemento CancelCalendarItem para cancelar uma reunião para a qual o usuário é o organizador. O valor do elemento ReferenceItemId indica o item a ser cancelado e pode ser a ID do item de um mestre recorrente ou uma única ocorrência.

<?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>

Este exemplo usa a operação CreateItem com um elemento DeclineItem para recusar uma reunião para a qual o usuário não é o organizador. Como no exemplo anterior, o valor do elemento ReferenceItemId indica o item a ser recusado e pode ser a ID do item de um mestre recorrente ou uma única ocorrência.

<?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>

Este exemplo usa a operação DeleteItem para excluir uma única ocorrência de um compromisso sem participantes. A ocorrência a ser excluída é especificada pelo elemento OccurrenceItemId , que é construído a partir da ID do item do mestre recorrente e do índice da ocorrência.

<?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>

Observe que você pode obter o mesmo resultado substituindo o elemento OccurrenceItemId por um elemento ItemId que contém a ID do item da ocorrência, conforme mostrado.

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

Confira também