2013-03-13 107 views
6

我使用Exchange Web Services調用GetRoomLists,我們正在運行Exchange 2010.下面的代碼正在通過控制檯應用程序執行。調用成功,每個XML響應的「無錯誤」,但沒有數據返回。當您嘗試通過Outlook約會添加一個房間時,我們會列出幾百個房間,因此不確定爲何會發生這種情況。GetRoomLists成功但沒有返回數據

我試過使用EWS DLL版本1.2和2.0,使用默認憑據或傳入憑據。我注意到,在最初發布這個響應頭文件表示我們使用的是Exchange 2012 SP2,因此我嘗試更新我的代碼以使用該ExchangeVersion枚舉值,但沒有更改結果。

我已成功地在此Exchange服務器上使用EWS來讀取郵箱,但從未在房間之前。

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跟蹤從Web服務請求/響應

<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> 

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

+0

您是否嘗試過使用不同的帳戶?也許呼叫身份沒有權限查看任何房間列表?在這種情況下,服務器只會返回空列表,如跟蹤中所示。 http://msdn.microsoft.com/en-us/library/exchange/dd899416(v=exchg.140).aspx列出您的響應爲典型的沒有任何房間列表在服務器上。 – 2013-03-13 20:53:44

+0

@RomanGruber - 剛剛讀了一下房間列表實際是什麼,我怎樣才能得到一個像Outlook一樣沒有房間列表的交換房間列表? – Peter 2013-03-13 21:42:48

回答

9

嗯,我找到了原因/解決方案。令人困惑的是,GetRoomLists不會返回房間列表,而是返回房間列表或「房間列表」集合的列表。這些是包含房間列表的特殊類型的分配列表。

如此處所述,http://social.msdn.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/4ff04c60-48c2-4a69-ab75-2383e73bfde2,您需要設置房間列表,或者需要查詢AD並檢查msExchRecipientDisplayType屬性以查找房間。

此鏈接顯示瞭如何編寫LDAP查詢返回房間爲例:http://social.msdn.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/e2d10953-a8f9-459c-8a0e-f10c2e568b26

代碼我放在一起尋找房間:

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

它(LDAP解決方案)是否適合您? – Igal 2013-03-14 12:20:52

+0

@ user301639 - 我的答案中的第二個鏈接的LDAP查詢確實從AD返回了房間,所以它看起來像在工作。 – Peter 2013-03-14 12:39:42

+0

我迷路了代碼,有一些步驟順序的死鎖, string roRootDSE = dsDirectorySearcher.SearchRoot.Path; DirectoryEntry deDirectoryEntry = new DirectoryEntry(roRootDSE); DirectorySearcher dsDirectorySearcher = new DirectorySearcher(deDirectoryEntry); 你是如何解決它的? 謝謝! – Igal 2013-03-14 12:58:18

相關問題