2011-08-19 53 views
1

作爲一個初學者到WCF我想要實現到得到所有用戶的Active Directory服務的調用,該方法是這樣的:WCF:如何通過Datacontract返回.NET Framework類?

[OperationContract] 
    SearchResultCollection GetAllUsers(); 

SearchResultCollection不可序列化,所以我必須做出這樣的事情:

[DataContract] SearchResultCollection

所以,我必須使自己的包裝類,它繼承了SearchResultCollection或使用IDataContractSerializer。兩種解決方案似乎都不容易

問題:「標準」方法如何將.NET類用作WCF服務中的返回類型?

(寫自己的DataContract爲我自己的類似乎很容易。))

回答

1

我認爲您最好的選擇是創建您自己的簡單POCO類來代表SearchResult,並返回這些對象的列表。真的,您希望能夠精確控制您從服務中發回的信息。例如:

[Serializable] 
public class MySearchResult 
{ 
    public string Name { get; set; } 

    public string Email { get; set; } 
} 

,簡單迭代searech結果,並拔出你需要像這樣的屬性:

var results = new List<MySearchResult>(); 

foreach (SearchResult r in searchResultCollection) 
{ 
    results.Add(new MySearchResult 
        { 
         Name = searchResult.Properties["Name"], 
         Email = searchResult.Properties["Email"] 
        }); 
} 

這樣的XML被髮送回不臃腫的所有屬性,你不要不需要,你可以序列化你自己的List<MySearchResult>返回結果。順便說一句,我不知道名稱和電子郵件屬性是否存在,我只是舉例說明。

+0

謝謝:),所以我必須自己做。我希望全能的.NET Framework能以某種方式自動完成。或者說這種工作已經有了自動化的方法。 –

+0

否 - 沒有解決序列化問題,但除此之外,即使您可以將其標記爲DataContract,您也不希望僅由於消息膨脹而對對象中的所有信息執行全面返回。 – jcvandan

3

DataContract路線將在這裏就夠了。的標準方法是與相關屬性來裝飾你的類,它會在方法是可消耗的由WCF:

[DataContract] 
public sealed class CustomerResponse 
{ 
    [DataMember] 
    public Guid CustomerReference { get; set; } 
} 

[ServiceContract] 
public interface IWcfMessagingService 
{ 
    [OperationContract] 
    CustomerResponse GetCustomer(); 
} 

如果類不是序列化的,我不認爲連包裝它會奏效。

但是,SearchResultCollection本身是從WCF方法返回的,因此您可以直接通過自己的服務,或者至少將其成功包裝。

0

我想我只是返回一個用戶列表,其中用戶是標記爲可序列化的自定義用戶類。從活動目錄獲取數據的方法可以通過循環遍歷結果來填充User類。