Tenemos un calendario público para nuestra empresa configurado en una carpeta pública de Exchange 2007. Puedo recuperar mis citas del calendario personal para el día actual usando el siguiente código. He buscado en línea alta y baja y no puedo encontrar un ejemplo de alguien que recupera información del calendario de un calendario de carpeta pública.Extraer citas de calendario público de Exchange 2007 mediante la API de servicios web de Exchange
Parece que debería ser factible, pero no puedo por mi vida ponerlo en funcionamiento. ¿Cómo puedo modificar el código a continuación para acceder al calendario? No estoy interesado en crear citas a través de asp.net, solo recuperando una lista simple. Estoy abierto a cualquier otra sugerencia también. Gracias.
AÑADIDO BOUNTY
- No puedo ser la única persona que alguna vez tenía que hacer esto. Hagamos que este problema se resuelva para las generaciones futuras.
actualizado de nuevo debido a la ignorancia
- me olvidó mencionar que el proyecto que estoy trabajando es .NET 2.0 (muy importante ¿no le parece?).
* Añadido mi solución de código siguiente *
- He reemplazado mi ejemplo de código original con el código que terminó trabajando. Muchas gracias a Oleg por proporcionar el código para encontrar la carpeta pública, que fue la parte más difícil. He modificado el código usando el ejemplo de aquí http://msexchangeteam.com/archive/2009/04/21/451126.aspx para usar el método FindAppointments más simple.
Este sencillo ejemplo devuelve una cadena html con las citas, pero puede usarla como base para personalizar según sea necesario. Puedes ver nuestra ida y vuelta bajo su respuesta a continuación.
using System;
using Microsoft.Exchange.WebServices.Data;
using System.Net;
namespace ExchangePublicFolders
{
public class Program
{
public static FolderId FindPublicFolder(ExchangeService myService, FolderId baseFolderId,
string folderName)
{
FolderView folderView = new FolderView(10, 0);
folderView.OffsetBasePoint = OffsetBasePoint.Beginning;
folderView.PropertySet = new PropertySet(FolderSchema.DisplayName, FolderSchema.Id);
FindFoldersResults folderResults;
do
{
folderResults = myService.FindFolders(baseFolderId, folderView);
foreach (Folder folder in folderResults)
if (String.Compare(folder.DisplayName, folderName, StringComparison.OrdinalIgnoreCase) == 0)
return folder.Id;
if (folderResults.NextPageOffset.HasValue)
folderView.Offset = folderResults.NextPageOffset.Value;
}
while (folderResults.MoreAvailable);
return null;
}
public static string MyTest()
{
ExchangeService myService = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
myService.Credentials = new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN");
myService.Url = new Uri("https://MAILSERVER/ews/exchange.asmx");
Folder myPublicFoldersRoot = Folder.Bind(myService, WellKnownFolderName.PublicFoldersRoot);
string myPublicFolderPath = @"PUBLIC_FOLDER_CALENDAR_NAME";
string[] folderPath = myPublicFolderPath.Split('\\');
FolderId fId = myPublicFoldersRoot.Id;
foreach (string subFolderName in folderPath)
{
fId = Program.FindPublicFolder(myService, fId, subFolderName);
if (fId == null)
{
return string.Format("ERROR: Can't find public folder {0}", myPublicFolderPath);
}
}
Folder folderFound = Folder.Bind(myService, fId);
if (String.Compare(folderFound.FolderClass, "IPF.Appointment", StringComparison.Ordinal) != 0)
{
return string.Format("ERROR: Public folder {0} is not a Calendar", myPublicFolderPath);
}
CalendarFolder AK_Calendar = CalendarFolder.Bind(myService, fId, BasePropertySet.FirstClassProperties);
FindItemsResults<Appointment> AK_appointments = AK_Calendar.FindAppointments(new CalendarView(DateTime.Now,DateTime.Now.AddDays(1)));
string rString = string.Empty;
foreach (Appointment AK_appoint in AK_appointments)
{
rString += string.Format("Subject: {0}<br />Date: {1}<br /><br />", AK_appoint.Subject, AK_appoint.Start);
}
return rString;
}
}
}
¡Hola! El código 'FindItemsResults' parece agradable. Me parece que olvidaste configurar 'PropertySet' para' CalendarView'. Es importante. Si solo usará las propiedades 'Subject' y' Start' de las citas de los resultados de búsqueda, debe establecer estas dos propiedades 'ItemSchema.Subject' y' AppointmentSchema.Start'. Si no lo hace, todas las 'PropertySet.FirstClassProperties' se enviarán desde el servidor de Exchange. Incluí en la carpeta vinculando este conjunto de propiedades solo para mostrar cuánto hay. Además, te recomiendo que continúes usando paginación. –
Oleg
Por cierto, el uso de 'ItemView' y' FindItemsResults- ' se debe a que modifiqué otro ejemplo que enumeraba los correos electrónicos.En la carpeta Buzón, encontrará ** no solo correos electrónicos, sino también requisitos para cumplir con una cita. Entonces, para enumerar el buzón, mejor debería usar la clase base 'Item'. Parece que con la carpeta de calendario no tendrás el problema, pero piensa en este posible problema. ¡Mis mejores deseos y buena suerte! –
Oleg
@Oleg Voy a mantener la paginación. Quité el PropertySet porque quería jugar con todas las propiedades. Voy a volver a agregarlo una vez que decida exactamente qué propiedades quiero usar. Por el momento, me limitaré al calendario, pero si necesito acceder a un buzón de correo electrónico, usaré la vista de artículo. – NinjaBomb