WCF: Как вернуть класс.NET Framework через Datacontract?
Как новичок в WCF, я хочу реализовать вызов службы Active Directory, которая получает всех пользователей, метод выглядит следующим образом:
[OperationContract]
SearchResultCollection GetAllUsers();
SearchResultCollection не сериализуем, поэтому я должен сделать что-то вроде этого:
[DataContract] SearchResultCollection
Поэтому я должен сделать свой собственный класс-обертку, который наследует SearchResultCollection или использовать IDataContractSerializer. Оба решения кажутся не простыми.
Вопрос: каков "стандартный" подход к использованию классов.NET в качестве типа возврата в службе WCF?
(Написание собственного DataContract для моего собственного класса кажется легким.;))
3 ответа
Я думаю, что вам лучше всего создать свой собственный простой класс POCO, чтобы представлять SearchResult
и вернуть список этих объектов. На самом деле вы хотите иметь возможность точно контролировать информацию, которую нужно отправить обратно из сервиса. Например:
[Serializable]
public class MySearchResult
{
public string Name { get; set; }
public string Email { get; set; }
}
Просто итерируйте результаты поиска и извлеките нужные вам свойства, например:
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>
вернуть результаты. И, кстати, я понятия не имею, существуют ли свойства Name и Email, я просто показываю пример.
DataContract
Здесь будет достаточно маршрута. Стандартный способ - украсить ваш класс соответствующими атрибутами, и он будет использован WCF в методах:
[DataContract]
public sealed class CustomerResponse
{
[DataMember]
public Guid CustomerReference { get; set; }
}
[ServiceContract]
public interface IWcfMessagingService
{
[OperationContract]
CustomerResponse GetCustomer();
}
Если класс не сериализуем, я не думаю, что даже его обертывание сработает.
Тем не менее SearchResultCollection
сам по себе возвращается из метода WCF, так что вы можете просто передать его прямо через собственный сервис или, по крайней мере, успешно обернуть его.
Я думаю, что я просто вернул бы список пользователей, где пользователь - это пользовательский класс пользователя, помеченный как сериализуемый. Метод, который получает данные из активного каталога, может заполнить класс User, просматривая результат.