15 Mart 2010 Pazartesi

Exchange Web Services (EWS) ile toplantı odalarını listeleme


Bir önceki yazımda gelen kullanıcının bulunduğu toplantıları listelemiştik. Bu yazımda ise yalnızca kullanıcı ile kısıtlı kalmayarak bütün toplantı odalarını ve dolu olan saatleri listeleyeceğiz. Ben burada ayrı ayrı yazacağım siz kullanacağınız yere göre değiştirir veya bir araya getirsiniz.
İlk önce toplantı odalarının adı ve eposta adreslerini listeyeceğim.
using System.DirectoryServices;
ekledikten sonra toplandı odasının adını ve eposta adresini tutacağım class yazıyoruz.

public class RoomMailbox
{
public string Email { get; set; }
public string DisplayName { get; set; }
}

ardından da örnek kod aşağıda.
private List<RoomMailbox> GetRooms()
{
List<RoomMailbox> listRoomMailbox = new List<RoomMailbox>();
string sqSearchQuery = "(&(&(&(mailNickname=*)(objectcategory=person)(objectclass=user)(msExchRecipientDisplayType=7))))";
SearchResultCollection srSearchResults;
string roRootDSE = "ldap bağlantı adresi";
DirectoryEntry deDirectoryEntry = new DirectoryEntry(roRootDSE);
DirectorySearcher dsDirectorySearcher = new DirectorySearcher(deDirectoryEntry);
dsDirectorySearcher.SearchScope = SearchScope.Subtree;
dsDirectorySearcher.Filter = sqSearchQuery;
dsDirectorySearcher.PropertiesToLoad.Add("mail");
dsDirectorySearcher.PropertiesToLoad.Add("displayName");
srSearchResults = dsDirectorySearcher.FindAll();
foreach (SearchResult srSearchResult in srSearchResults)
{
listRoomMailbox.Add(new RoomMailbox
{
DisplayName = srSearchResult.Properties["displayName"][0].ToString(),
Email = srSearchResult.Properties["mail"][0].ToString()
}
);
}
return listRoomMailbox;
}


msExchRecipientDisplayType=7 toplantı odalarını getirmek için 7 yazdık.
"ldap bağlantı adresi" kısmına ldap adresiniz yazmanız gerekmekte.
Aşadağıda da gelen kullanıcın yetkileri ile Exchange Web Servislerini kullanarak
ilgili toplantı odasının dolu olan saatlerini listeleyelim.
Ben burada örnek olarak 1 adet toplantı odasının(Akdeniz) dolu olan saatlerini getiriyorum.
Ancak siz yukarıdaki kod ile birleştirerek bütün toplantı odalarının dolu olan saatlerini getirebilirsiniz.

Web servisine bağlanabilmemiz tüm sertifika izinleri için gerekli namespaceleri eklemeyi unutmayalım.

using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;


private void GetCalendarByMailBox()
{
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

ServicePointManager.ServerCertificateValidationCallback =
delegate(Object obj, X509Certificate certificate,
X509Chain chain, SslPolicyErrors errors)
{
return true;
};

System.Net.WebProxy proxyObject = new System.Net.WebProxy();
proxyObject.Credentials = CredentialCache.DefaultCredentials;
service.UseDefaultCredentials = true;
service.Url = new Uri("https://domain/ews/exchange.asmx");

Mailbox mb = new Mailbox("Akdeniz@litwareinc.com");
FolderId fid1 = new FolderId(WellKnownFolderName.Calendar, mb);
FindItemsResults<Appointment> findResults = service.FindAppointments(fid1,
new CalendarView(DateTime.Now.AddDays(-5), DateTime.Now.AddDays(5)));

foreach (Appointment appointment in findResults)
{
if ((appointment.AppointmentState & 4) != 4)
Response.Write(appointment.Subject + "<br />");
}

}

yukarıdaki kodda bulunan önemli bir nokta da

if ((appointment.AppointmentState & 4) != 4)

kontrolü yapmamızdır. Bu kontrol ile cancel edilmiş toplantı odalarını getirmiyoruz.
Buradaki makalede açıklamasını bulabilirsiniz.

1 yorum:

Ö.Can dedi ki...

Merhaba . service.FindAppointments(folderId,cv); kısmında aşağıdaki hatayı alıyorum . Yardımcı olabilir misiniz ?

The response received from the service didn't contain valid XML.