Az Exchange Web Services (EWS) segítségével tetszőleges klienssel kapcsolódhatunk az Exchange Serverhez és lekérdezhetjük a felhasználóink naptárát.
Mivel szabványos SOAP-os webszolgáltatásról van szó, az első lépés természetesen a WSDL fájl elérése, ami itt található:
http://SERVER/EWS/services.wsdl
Erre adjunk referenciát Visual Studioban (a SERVER helyére beírva az Exchange Serverünk FQDN-jét) és közben figyeljünk a http/https alkalmazására. Ha ez megvan, egy ExchangeServerBinding objektumon keresztül kapcsolódhatunk a szolgáltatáshoz:
ExchangeServiceBinding binding = new ExchangeServiceBinding();
binding.Credentials = CredentialCache.DefaultCredentials;
binding.Url = @"http://SERVER/EWS/exchange.asmx";
Fontos, hogy mindenképpen hitelesíteni kell magunkat, alapértelmezés szerint anonymous felhasználó nem fér hozzá a webszolgáltatáshoz. A foglaltság lekérdezéséhez számos paramétert át kell adnunk a kérésben, például azt, hogy a cél felhasználó naptárának mely időszakára vagyunk kíváncsiak. Szerintem a legegyszerűbb egy hétfőtől péntekig tartó időszakot megadni:
Duration duration = new Duration();
duration.StartTime = this._firstDay; // E hét hétfője
duration.EndTime = this._firstDay.AddDays( 5 );
Ezen a webszolgáltatáson keresztül többféle formátumban is lekérdezhetjük a felhasználó naptárát. Nekünk most arra van szükségünk, hogy az előbb megadott időszakban, fél órás bontásokban (interval), mikor szabad vagy mikor foglalt az illető:
FreeBusyViewOptionsType options = new FreeBusyViewOptionsType();
options.TimeWindow = duration;
options.RequestedView = FreeBusyViewType.FreeBusyMerged;
options.RequestedViewSpecified = true;
options.MergedFreeBusyIntervalInMinutes = 30;
options.MergedFreeBusyIntervalInMinutesSpecified = true;
Meg kell adnunk azt is, hogy kinek a naptára érdekel minket (Free/Busy time Read jogosultsággal kell bírnunk a naptárához), itt több felhasználót is felsorolhatunk MailboxData objektumok formájában:
MailboxData mailbox = new MailboxData();
mailbox.AttendeeType = MeetingAttendeeType.Required;
mailbox.Email = new EmailAddress();
mailbox.Email.Address = "felhasználó@example.com";
A legfájdalmasabb rész a kérő időzónájához tartozó összes paraméter megadása. A Central European Standard Time zónához tartozó értékeket kibogarásztam a registry-ből, de persze akár változhat is:
SerializableTimeZone timeZone = new SerializableTimeZone();
timeZone.Bias = -60;
timeZone.StandardTime = new SerializableTimeZoneTime();
timeZone.StandardTime.Bias = 0;
timeZone.StandardTime.DayOfWeek = "Sunday";
timeZone.StandardTime.DayOrder = 5;
timeZone.StandardTime.Month = 10;
timeZone.StandardTime.Time = "03:00:00";
timeZone.DaylightTime = new SerializableTimeZoneTime();
timeZone.DaylightTime.Bias = -60;
timeZone.DaylightTime.DayOfWeek = "Sunday";
timeZone.DaylightTime.DayOrder = 5;
timeZone.DaylightTime.Month = 3;
timeZone.DaylightTime.Time = "00:00:00";
Ha ez mind megvan, összerakhatjuk őket egyetlen objektumba:
GetUserAvailabilityRequestType request = new GetUserAvailabilityRequestType();
request.TimeZone = timeZone;
request.FreeBusyViewOptions = options;
request.MailboxDataArray = new MailboxData[] { mailbox };
Végül meghívhatjuk a webszolgáltatás GetUserAvailabilty függvényét:
GetUserAvailabilityResponseType response = binding.GetUserAvailability( request );
A válaszban többféle formában is megtaláljuk, hogy mikor foglalt és mikor szabad az illető. Egy szabad/foglalt naptár rajzolásához talán a legegyszerűbb, ha a response.FreeBusyResponseArray[ 0 ].FreeBusyView.MergedFreeBusy stringet vizsgáljuk: ez pontosan annyi karakterből áll, ahány intervallumot kértünk a szervertől és minden esetben 0 jelzi, ha még szabad az az intervallum. Az egyes értékek előbb egy napon belül mennek végig az intervallumokon, majd utána jön a következő nap.