2013-03-13 21 views
6

Exchange Web Servicesを使用してGetRoomListsを呼び出すと、Exchange 2010が実行されています。以下のコードはコンソールアプリケーションを通じて実行されています。 "No Error"というXML応答に従って呼び出しは成功しますが、データは返されません。 Outlook Appointmentで1つ追加しようとすると数百の部屋が表示されるため、なぜこのようなことが起こるのかはわかりません。GetRoomListsは成功しましたがデータは返されません

EWS DLLバージョン1.2と2.0の両方を使用して、デフォルトの資格情報を使用したり、資格情報を渡したりしてみました。私は最初にこれを投稿した後、ExchangeヘッダーにはExchange 2012 SP2が使用されているとわかりましたので、ExchangeVersion enum値を使用するようにコードを更新しようとしましたが、結果に変更はありませんでした。

メールボックスを読むのにこのExchangeサーバー上でEWSを使用していますが、これまでは部屋はありませんでした。 GetRoomLists上の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> 

MSDNドキュメントから

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トレース:http://msdn.microsoft.com/en-us/library/dd899416(v=exchg.140).aspx

+0

あなたは別のアカウントを使用してみましたか?呼び出し元のIDにルームリストを表示する権限がない可能性がありますか?この場合、サーバはあなたのトレースに見られる空のリストを返します。 http://msdn.microsoft.com/en-us/library/exchange/dd899416(v=exchg.140).aspxには、サーバー上にルームリストを持たないため、通常の応答が表示されます。 –

+0

@RomanGruber - ルームリストが実際に何であるかをちょっとだけ読んだだけで、ルームリストなしでOutlookのように部屋のリストを取得するにはどうすればいいですか? – Peter

答えて

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

+0

@ user301639 - 私の答えの2番目のリンクからのLDAPクエリは、ADからルームを戻すので、動作しているように見えます。 – Peter

+0

私はコードで迷ってしまった、階段のあるデッドロックがある。 DirectoryEntry deDirectoryEntry =新しいDirectoryEntry(roRootDSE); DirectorySearcher dsDirectorySearcher =新しいDirectorySearcher(deDirectoryEntry); どうやって解決しましたか? ありがとう! – Igal

関連する問題