Compartir a través de


Acceso a una serie periódica mediante EWS en Exchange

Obtenga información sobre cómo acceder a los elementos de calendario de una serie periódica mediante la API administrada de EWS o EWS en Exchange.

Una serie periódica de citas o reuniones se compone de un patrón periódico, una serie de repeticiones en una serie que se repiten según un patrón de conjunto y, opcionalmente, conjuntos de repeticiones que se cambiaron y que se eliminaron. Puede usar la API administrada de EWS o EWS para acceder a los elementos de calendario de una serie periódica. Esto le permite:

  • Compruebe si un elemento de calendario asociado a un identificador de elemento es un patrón periódico, una aparición en una serie o una excepción a una serie.

  • Busque citas periódicas en la carpeta de calendario.

  • Obtención de elementos de calendario de periodicidad relacionados

  • Recorre en iteración las repeticiones de una serie, las excepciones de repetición o las eliminaciones de repeticiones.

Obtención de una colección de elementos de calendario periódicos mediante la API administrada de EWS

Si desea recuperar una colección de citas, puede usar el método ExchangeService.FindAppointments para recuperar todas las citas entre una fecha de inicio y finalización determinada y, a continuación, agregar todos los elementos de calendario con un tipo de cita De repetición o excepción a una colección, como se muestra en el ejemplo siguiente.

En este ejemplo se supone que se ha autenticado en un servidor de Exchange y ha adquirido un objeto ExchangeService denominado servicio.

public static Collection<Appointment> FindRecurringCalendarItems(ExchangeService service, 
                                                                    DateTime startSearchDate, 
                                                                    DateTime endSearchDate)
{
    // Instantiate a collection to hold occurrences and exception calendar items.
    Collection<Appointment> foundAppointments = new Collection<Appointment>();
    // Create a calendar view to search the calendar folder and specify the properties to return.
    CalendarView calView = new CalendarView(startSearchDate, endSearchDate);
    calView.PropertySet = new PropertySet(BasePropertySet.IdOnly, 
                                            AppointmentSchema.Subject, 
                                            AppointmentSchema.Start, 
                                            AppointmentSchema.IsRecurring, 
                                            AppointmentSchema.AppointmentType);
    // Retrieve a collection of calendar items.
    FindItemsResults<Appointment> findResults = service.FindAppointments(WellKnownFolderName.Calendar, calView);
    // Add all calendar items in your view that are occurrences or exceptions to your collection.
    foreach (Appointment appt in findResults.Items)
    {
        if (appt.AppointmentType == AppointmentType.Occurrence || appt.AppointmentType == AppointmentType.Exception)
        {
            foundAppointments.Add(appt);
        }
        else
        {
            Console.WriteLine("Discarding calendar item of type {0}.", appt.AppointmentType);
        }
    }
    return foundAppointments;
}

Tenga en cuenta que los elementos de calendario maestro periódicos no se devuelven en una llamada a FindAppointments. Si desea recuperar patrones periódicos o quiere un enfoque más general para recuperar elementos de calendario, debe usar ExchangeService.FindItems. A continuación, puede usar un filtro de búsqueda para recuperar solo los elementos con una fecha de inicio mayor o igual que la fecha que elija y una vista de elemento para limitar el número de elementos que se van a devolver. Tenga en cuenta que no se encontrará un patrón periódico con una fecha de inicio anterior a la fecha de inicio de la búsqueda, aunque se produzcan repeticiones en este intervalo.

En este ejemplo se supone que se ha autenticado en un servidor de Exchange y ha adquirido un objeto ExchangeService denominado servicio.

public static Collection<Appointment> FindCalendarItemsByAppointmentType(ExchangeService service, 
                                                                         AppointmentType myAppointmentType, 
                                                                         DateTime startSearchDate)
{
    Collection<Appointment> foundAppointments = new Collection<Appointment>();
    // Create a search filter based on the start search date.
    SearchFilter.SearchFilterCollection searchFilter = new SearchFilter.SearchFilterCollection();
    searchFilter.Add(new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, startSearchDate));
    // Create an item view to specify which properties to return.
    ItemView view = new ItemView(20);
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, 
                                       AppointmentSchema.Subject, 
                                       AppointmentSchema.Start, 
                                       AppointmentSchema.AppointmentType,
                                       AppointmentSchema.IsRecurring);
    // Get the appointment items from the server with the properties we specified.
    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Calendar, searchFilter, view);
    // Add each of the appointments of the type you want to the collection.
    foreach (Item item in findResults.Items)
    {
        Appointment appt = item as Appointment;
        if (appt.AppointmentType == myAppointmentType)
        {
            foundAppointments.Add(appt);
        }
    }
    return foundAppointments;
}

A veces tienes una pieza del rompecabezas, pero para resolverlo necesitas el resto de las piezas. Si tiene el identificador de elemento para un elemento de calendario de periodicidad, puede obtener las demás partes que necesita mediante una de varias propiedades o métodos de la API administrada de EWS.

Tabla 1. Propiedad o método de API administrada de EWS que se va a usar para obtener elementos de calendario de periodicidad relacionados

Si tiene el identificador de elemento para... Usted puede obtener... Mediante el uso de ...
Elemento de calendario maestro periódico
La primera aparición de una serie
La última aparición de una serie
Excepciones a una serie
Las citas eliminadas de una serie
Cualquier aparición (dado su índice)
Propiedad Appointment.FirstOccurrence
Propiedad Appointment.LastOccurrence
Propiedad Appointment.ModifiedOccurrences
Propiedad Appointment.DeletedOccurrences
Método Appointment.BindToOccurrence
Una sola aparición en una serie
El patrón periódico
Método Appointment.BindToRecurringMaster
Cualquier elemento de calendario (un objeto Appointment )
Valor de enumeración del tipo de cita
Propiedad Appointment.AppointmentType

En el ejemplo de código siguiente se muestra cómo obtener un patrón periódico, la primera o la última aparición de una serie o una aparición dada su índice.

En este ejemplo se supone que se ha autenticado en un servidor de Exchange y ha adquirido un objeto ExchangeService denominado servicio.

public static void GetRelatedRecurrenceCalendarItems(ExchangeService service, ItemId itemId)
{
    Appointment calendarItem = Appointment.Bind(service, itemId, new PropertySet(AppointmentSchema.AppointmentType));
    Appointment recurrMaster = new Appointment(service);
    PropertySet props = new PropertySet(AppointmentSchema.AppointmentType,
                                        AppointmentSchema.Subject,
                                        AppointmentSchema.FirstOccurrence,
                                        AppointmentSchema.LastOccurrence,
                                        AppointmentSchema.ModifiedOccurrences,
                                        AppointmentSchema.DeletedOccurrences);
    // If the item ID is not for a recurring master, retrieve the recurring master for the series.
    switch (calendarItem.AppointmentType)
    {
        // Calendar item is a recurring master so use Appointment.Bind
        case AppointmentType.RecurringMaster:
            recurrMaster = Appointment.Bind(service, itemId, props);
            break;
        // The calendar item is a single instance meeting, so there are no instances to modify or delete.
        case AppointmentType.Single:
            Console.WriteLine("Item id must reference a calendar item that is part of a recurring series.");
            return;
        // The calendar item is an occurrence in the series, so use BindToRecurringMaster.
        case AppointmentType.Occurrence:
            recurrMaster = Appointment.BindToRecurringMaster(service, itemId, props);
            break;
        // The calendar item is an exception to the series, so use BindToRecurringMaster.                
        case AppointmentType.Exception:
            recurrMaster = Appointment.BindToRecurringMaster(service, itemId, props);
            break;
    }
    // View the first occurrence, last occurrence, and number of modified and deleted occurrences associated with the recurring master.
    Console.WriteLine("Information for the {0} recurring series:", recurrMaster.Subject);
    Console.WriteLine("The start time for the first appointment with id \t{0} was on \t{1}.", 
                        recurrMaster.FirstOccurrence.ItemId.ToString().Substring(144), 
                        recurrMaster.FirstOccurrence.Start.ToString());
    Console.WriteLine("The start time for the last appointment with id \t{0} will be on \t{1}.", 
                        recurrMaster.LastOccurrence.ItemId.ToString().Substring(144), 
                        recurrMaster.LastOccurrence.Start.ToString());
    Console.WriteLine("There are {0} modified occurrences and {1} deleted occurrences.", 
                        recurrMaster.ModifiedOccurrences == null ? "no" : recurrMaster.ModifiedOccurrences.Count.ToString(), 
                        recurrMaster.DeletedOccurrences == null ? "no" : recurrMaster.DeletedOccurrences.Count.ToString());
    // Bind to the first occurrence of a series by using its index.
    Appointment firstOccurrence = Appointment.BindToOccurrence(service, 
                                                                recurrMaster.Id, 
                                                                1, // Index of first item is 1, not 0.
                                                                new PropertySet(AppointmentSchema.AppointmentType,
                                                                                AppointmentSchema.Start));
    Console.WriteLine("Compare the start times for a recurring master's first occurrence " + 
                        "and the occurrence found at index 1 using the BindToOccurrence method:");
    Console.WriteLine("The appointment at index 1 has a start time of\t\t\t\t {0}\n" +
                        "Which matches that of the first occurrence on the recurring master: \t {1}",
                        firstOccurrence.Start.ToString(),
                        recurrMaster.FirstOccurrence.Start.ToString());
}

Acceso a elementos de calendario de una serie periódica mediante EWS

El acceso a los elementos de calendario de una serie periódica es muy similar al acceso a instancias únicas de elementos de calendario. Use una solicitud de operación GetItem , especificando las propiedades que desee, con occurrenceItemId de la instancia de cita que necesita. OccurrenceItemId contiene el ItemID del patrón periódico de la repetición, así como su valor de índice en la serie.

El siguiente XML muestra la solicitud GetItem usada para devolver una aparición en una serie especificada por su índice. Tenga en cuenta que el ItemID del patrón periódico se ha acortado para mejorar la legibilidad.

<?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="Exchange2010" />
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="calendar:CalendarItemType" />
          <t:FieldURI FieldURI="calendar:Start" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:ItemIds>
        <t:OccurrenceItemId RecurringMasterId="AAMkA" InstanceIndex="1" />
      </m:ItemIds>
    </m:GetItem>
  </soap:Body>
</soap:Envelope>

El servidor responde a la solicitud GetItem con un mensaje GetItemResponse que incluye un valor ResponseCode de NoError, que indica que el correo electrónico se creó correctamente y el ItemId del mensaje recién creado.

Consulte también