2013-03-13 16 views
6

Dzwonię do GetRoomLists za pomocą usług Exchange Web Services, używamy Exchange 2010. Poniższy kod jest wykonywany za pośrednictwem aplikacji Console. Wywołanie się powiedzie, zgodnie z odpowiedzią XML "No Error", ale żadne dane nie są zwracane. Mamy kilkaset pokoi wymienionych podczas próby dodania ich przez termin spotkania w programie Outlook, więc nie mamy pewności, dlaczego tak się stanie.GetRoomLists powiedzie się, ale nie zwraca żadnych danych

Próbowałem używać obu bibliotek EWS w wersji 1.2 i 2.0, używając domyślnych poświadczeń lub przekazując dane uwierzytelniające. Zauważyłem po tym, jak pierwotnie napisałem, że nagłówek odpowiedzi mówi, że używamy Exchange 2012 SP2, więc próbowałem zaktualizować mój kod, aby użyć tej wartości wyliczeniowej ExchangeVersion, ale bez zmiany wyniku.

Pomyślnie użyłem EWS na tym serwerze Exchange do odczytu skrzynek pocztowych, ale nigdy wcześniej.

C#

 ExchangeService es = new ExchangeService(ExchangeVersion.Exchange2010); 
     es.TraceFlags = TraceFlags.EwsResponse | TraceFlags.EwsRequest; 
     es.TraceEnabled = true; 
     es.UseDefaultCredentials = true; 
     es.AutodiscoverUrl("[email protected]"); 
     //this collection is empty after processing 
     EmailAddressCollection eac = es.GetRoomLists(); 

XML Ślad Od Zamówienie Web Service/Response

<Trace Tag="EwsRequest" Tid="9" Time="2013-03-13 20:39:41Z" Version="14.03.0032.000"> 
    <?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="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
     <t:RequestServerVersion Version="Exchange2010" /> 
    </soap:Header> 
    <soap:Body> 
     <m:GetRoomLists /> 
    </soap:Body> 
    </soap:Envelope> 
</Trace> 

<Trace Tag="EwsResponse" Tid="9" Time="2013-03-13 20:39:41Z" Version="14.03.0032.000"> 
    <?xml version="1.0" encoding="utf-8"?> 
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
     <h:ServerVersionInfo MajorVersion="14" MinorVersion="2" MajorBuildNumber="328" MinorBuildNumber="9" Version="Exchange2010_SP2" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <GetRoomListsResponse ResponseClass="Success" xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"> 
     <ResponseCode>NoError</ResponseCode> 
     <m:RoomLists xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" /> 
     </GetRoomListsResponse> 
    </s:Body> 
    </s:Envelope> 
</Trace> 

MSDN Dokumentacja GetRoomLists: http://msdn.microsoft.com/en-us/library/dd899416(v=exchg.140).aspx

+0

Czy próbowałeś za pomocą różnych kont? Może tożsamość dzwoniącego nie ma uprawnień do wyświetlania list pokojowych? W takim przypadku serwer po prostu zwróci pustą listę, jak widać na twoim śladzie. http://msdn.microsoft.com/en-us/library/exchange/dd899416(v=exchg.140).aspx wymienia twoją odpowiedź jako typową dla braku listy pokojów na serwerze. –

+0

@RomanGruber - Czytając nieco więcej o tym, czym właściwie jest Lista pokoi, w jaki sposób mogę uzyskać listę pokoi w zamian takich jak Outlook bez listy pokoi? – Peter

Odpowiedz

9

Dobrze znalazłem przyczynę/rozwiązanie. Zamieszanie było w tym, że GetRoomLists nie zwraca listy pokoi, ale zamiast tego listę listy pokoi lub zbiór "List pokoju". Są to specjalne listy dystrybucyjne zawierające listę pokoi.

Zgodnie z opisem tutaj, http://social.msdn.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/4ff04c60-48c2-4a69-ab75-2383e73bfde2, musisz skonfigurować listy pokojowe lub zapytać AD i sprawdzić atrybut msExchRecipientDisplayType, aby wyśledzić pokoje.

Ten link pokazuje przykład, jak napisać zapytanie LDAP powrotu pokoje: http://social.msdn.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/e2d10953-a8f9-459c-8a0e-f10c2e568b26

Kod ułożyła dla pomieszczeń znalezieniem:

private List<string> GetConfRooms(string filter) 
{ 
    List<string> sRooms = new List<string>(); 

    DirectoryEntry deDomain = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().GetDirectoryEntry(); 
    DirectorySearcher dsRooms = new DirectorySearcher(deDomain); 

    dsRooms.Filter = string.Format("(&(&(&(mailNickname={0}*)(objectcategory=person)(objectclass=user)(msExchRecipientDisplayType=7))))", filter); 

    dsRooms.PropertiesToLoad.Add("sn"); 
    dsRooms.PropertiesToLoad.Add("mail"); 

    foreach (SearchResult sr in dsRooms.FindAll()) 
    { 
     sRooms.Add(sr.Properties["mail"][0].ToString()); 
    } 

    return sRooms; 
} 
+0

Czy to (rozwiązanie LDAP) działało dla ciebie? – Igal

+0

@ user301639 - Zapytanie LDAP z drugiego linku w mojej odpowiedzi przywraca pokoje z AD, więc wygląda na to, że działa. – Peter

+0

Zgubiłem się z kodem, istnieje pewien zakleszczenie z kolejnością kroków, string roRootDSE = dsDirectorySearcher.SearchRoot.Path; DirectoryEntry deDirectoryEntry = new DirectoryEntry (roRootDSE); DirectorySearcher dsDirectorySearcher = new DirectorySearcher (deDirectoryEntry); jak to rozwiązałeś? dziękuję! – Igal

Powiązane problemy