2013-03-13 3 views
6

Sto chiamando GetRoomLists utilizzando i servizi Web di Exchange, stiamo eseguendo Exchange 2010. Il codice riportato di seguito viene eseguito tramite un'applicazione Console. La chiamata ha esito positivo, secondo la risposta XML di "Nessun errore", ma non viene restituito alcun dato. Abbiamo diverse centinaia di stanze elencate quando provi ad aggiungerne una tramite un Appuntamento di Outlook, quindi non sono sicuro del motivo per cui ciò accadrebbe.GetRoomLists ha esito positivo ma non restituisce alcun dato

Ho provato a utilizzare sia EWS DLL versione 1.2 e 2.0, utilizzando credenziali predefinite o passando le credenziali. Ho notato che, dopo aver pubblicato in origine questo, l'intestazione della risposta dice che stiamo utilizzando Exchange 2012 SP2, quindi ho provato ad aggiornare il mio codice per utilizzare il valore dell'enumerazione di ExchangeVersion, ma nessuna modifica nel risultato.

Ho utilizzato con successo EWS su questo server Exchange per leggere le cassette postali, ma mai stanze prima.

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(); 

Trace XML Da Richiesta 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 documentazione su GetRoomLists: http://msdn.microsoft.com/en-us/library/dd899416(v=exchg.140).aspx

+0

Hai provato a usare diversi account? Forse l'identità chiamante non ha il permesso di vedere liste di stanze? In tal caso il server restituirà semplicemente la lista vuota, come si vede nella traccia. http://msdn.microsoft.com/en-us/library/exchange/dd899416(v=exchg.140).aspx elenca la tua risposta come tipica per non avere liste di stanze sul server. –

+0

@RomanGruber - Avendo appena letto un po 'di più su cosa sia effettivamente una lista di stanze, come posso ottenere un elenco di stanze in cambio come fa Outlook senza una lista di stanze? – Peter

risposta

9

Beh ho trovato la causa/soluzione. La confusione riguardava il fatto che GetRoomLists non restituiva un elenco di stanze, ma piuttosto un elenco di un elenco di stanze o una raccolta di "Elenchi di stanze". Questi sono un tipo speciale di lista di distribuzione che contiene un elenco di stanze.

Come descritto qui, http://social.msdn.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/4ff04c60-48c2-4a69-ab75-2383e73bfde2, è necessario impostare gli elenchi delle camere o è necessario eseguire una query su AD e controllare l'attributo msExchRecipientDisplayType per rintracciare le stanze.

Questo link mostra un esempio di come scrivere la query LDAP per restituire camere: http://social.msdn.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/e2d10953-a8f9-459c-8a0e-f10c2e568b26

Codice ho messo insieme per Ricerca delle camere:

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

Ha funzionato per te (la soluzione LDAP)? – Igal

+0

@ user301639 - La query LDAP dal secondo link nella mia risposta riporta le stanze da AD, quindi sembra che funzioni. – Peter

+0

Mi sono perso con il codice, c'è un deadlock con l'ordine dei passaggi, string roRootDSE = dsDirectorySearcher.SearchRoot.Path; DirectoryEntry deDirectoryEntry = new DirectoryEntry (roRootDSE); DirectorySearcher dsDirectorySearcher = new DirectorySearcher (deDirectoryEntry); come hai risolto? grazie! – Igal