Atualizar uma série recorrente usando o EWS no Exchange
Saiba como atualizar uma série recorrente inteira ao mesmo tempo usando a API Gerenciada do EWS ou o EWS no Exchange.
Você pode usar a API Gerenciada do EWS ou o EWS para atualizar uma série recorrente atualizando toda a série ou atualizando uma única ocorrência. Neste artigo, discutiremos como atualizar a série inteira de uma só vez.
Em geral, atualizar uma série recorrente é muito semelhante à modificação de um único compromisso. Você usa os mesmos métodos e operações, mas usa a ID do item do mestre recorrente da série. Em alguns casos, talvez você não comece com o mestre recorrente e talvez seja necessário encontrar a ID do item para o mestre recorrente.
No entanto, há uma diferença fundamental a ser considerada ao atualizar uma série recorrente: atualizar o padrão de recorrência. Atualizar o padrão de recorrência só é possível com o mestre recorrente e as alterações no padrão podem adicionar ou remover ocorrências. Por exemplo, se você modificar a propriedade Recurrence.EndDate para uma data posterior ao valor atual, o padrão de recorrência será reavaliado e ocorrências adicionais poderão ser adicionadas.
Modificar todas as ocorrências em uma série usando a API Gerenciada do EWS
Para modificar todas as ocorrências em uma série, você:
- Associar ao mestre recorrente da série usando o método Appointment.BindToRecurringMaster ou Appointment.Bind em um mestre recorrente.
- Atualize as propriedades no objeto compromisso mestre recorrente.
- Salve as alterações no mestre recorrente usando o método Appointment.Save .
O exemplo a seguir atualiza uma série recorrente para alterar o local, adicionar um participante e modificar o padrão de recorrência. Este exemplo pressupõe que o objeto ExchangeService passado no parâmetro de serviço foi inicializado com valores válidos nas propriedades Credenciais e Url . O parâmetro RecorrenteAppointment é um objeto Appointment associado a uma ocorrência ou ao mestre recorrente para que a série seja atualizada.
using Microsoft.Exchange.WebServices.Data;
public static bool UpdateRecurringSeries(ExchangeService service, Appointment recurringAppointment)
{
Appointment recurringMaster = null;
// If the item is a single appointment, fail.
if (recurringAppointment.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 (recurringAppointment.AppointmentType != AppointmentType.RecurringMaster)
{
// If an occurrence was passed in, bind to the master.
try
{
// This method results in a call to EWS.
recurringMaster = Appointment.BindToRecurringMaster(service, recurringAppointment.Id);
}
catch (Exception ex)
{
Console.WriteLine("Couldn't bind to master: {0}", ex.Message);
return false;
}
}
else
{
// Bind to the appointment to load all properties.
// This method results in a call to EWS.
recurringMaster = Appointment.Bind(service, recurringAppointment.Id);
}
// Basic updates. These kinds of updates are the same
// as if you were updating a single appointment.
// Update the location. All occurrences will update to this new location.
recurringMaster.Location = "Conference Room 2";
// Add an attendee.
Attendee newAttendee = new Attendee("sadie@contoso.com");
recurringMaster.RequiredAttendees.Add(newAttendee);
// Changes to the recurrence. This is only applicable to a recurring
// master.
// If the series has an end date, extend the series to add two more occurrences.
if (recurringMaster.Recurrence.HasEnd)
{
// NumberOfOccurrences is only set if the user created the
// appointment with a set number of occurrences.
// Otherwise, there's a start and end date.
if (recurringMaster.Recurrence.NumberOfOccurrences != null)
{
recurringMaster.Recurrence.NumberOfOccurrences += 2;
}
else
{
// This is a bit more complicated if you want to add two more
// occurrences. You need to calculate a new end date.
Type recurrenceType = recurringMaster.Recurrence.GetType();
switch (recurrenceType.Name)
{
case "DailyPattern":
recurringMaster.Recurrence.EndDate =
recurringMaster.Recurrence.EndDate.Value.AddDays(2);
break;
case "WeeklyPattern":
recurringMaster.Recurrence.EndDate =
recurringMaster.Recurrence.EndDate.Value.AddDays(14);
break;
case "YearlyPattern":
recurringMaster.Recurrence.EndDate =
recurringMaster.Recurrence.EndDate.Value.AddYears(2);
break;
default:
// Do nothing here. There are other recurrence
// types but for simplicity, these aren't covered.
break;
}
}
}
else
{
// If it has no end, set an end date to 2 weeks from today.
recurringMaster.Recurrence.EndDate = DateTime.Now.AddDays(14);
}
// Update the series.
try
{
// This method results in a call to EWS.
recurringMaster.Update(ConflictResolutionMode.AutoResolve);
}
catch (Exception ex)
{
Console.WriteLine("Error updating series: {0}", ex.Message);
return false;
}
return true;
}
Modificar todas as ocorrências em uma série usando o EWS
Para modificar todas as ocorrências em uma série, você precisa usar a operação UpdateItem com a ID do item do mestre recorrente no elemento ItemId na solicitação. A estrutura da solicitação é a mesma que uma solicitação para atualizar um único compromisso.
O exemplo a seguir atualiza a série recorrente das seguintes maneiras:
- Atualizações o local da série definindo o elemento Local.
- Atualizações os participantes definindo o elemento RequiredAttendees.
- Atualizações a recorrência definindo o elemento Recorrência (RecurrenceType).
<?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:UpdateItem MessageDisposition="SaveOnly" ConflictResolution="AutoResolve" SendMeetingInvitationsOrCancellations="SendToAllAndSaveCopy">
<m:ItemChanges>
<t:ItemChange>
<t:ItemId Id="AAMkADA5..." ChangeKey="DwAAABYA..." />
<t:Updates>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:Location" />
<t:CalendarItem>
<t:Location>Conference Room 2</t:Location>
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:RequiredAttendees" />
<t:CalendarItem>
<t:RequiredAttendees>
<t:Attendee>
<t:Mailbox>
<t:Name>Mack Chaves</t:Name>
<t:EmailAddress>mack@contoso.com</t:EmailAddress>
<t:RoutingType>SMTP</t:RoutingType>
</t:Mailbox>
</t:Attendee>
<t:Attendee>
<t:Mailbox>
<t:Name>Sadie Daniels</t:Name>
<t:EmailAddress>sadie@contoso.com</t:EmailAddress>
<t:RoutingType>SMTP</t:RoutingType>
</t:Mailbox>
</t:Attendee>
</t:RequiredAttendees>
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:Recurrence" />
<t:CalendarItem>
<t:Recurrence>
<t:WeeklyRecurrence>
<t:Interval>1</t:Interval>
<t:DaysOfWeek>Tuesday</t:DaysOfWeek>
</t:WeeklyRecurrence>
<t:EndDateRecurrence>
<t:StartDate>2014-05-06</t:StartDate>
<t:EndDate>2014-06-22-04:00</t:EndDate>
</t:EndDateRecurrence>
</t:Recurrence>
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:MeetingTimeZone" />
<t:CalendarItem>
<t:MeetingTimeZone TimeZoneName="Pacific Standard Time" />
</t:CalendarItem>
</t:SetItemField>
</t:Updates>
</t:ItemChange>
</m:ItemChanges>
</m:UpdateItem>
</soap:Body>
</soap:Envelope>
O servidor responde com um elemento UpdateItemResponse que inclui um elemento ResponseCode com um valor de NoError, o que indica que a atualização foi bem-sucedida.