WCF: Как вернуть класс .NET Framework через Datacontract? - PullRequest
1 голос
/ 19 августа 2011

Как новичок в WCF, я хочу реализовать вызов службы Active Directory, который получает всех пользователей, метод выглядит следующим образом:

    [OperationContract]
    SearchResultCollection GetAllUsers();

SearchResultCollection не сериализуема, поэтому я должен сделать что-то вроде этого:

[DataContract] SearchResultCollection

Поэтому мне нужно создать свой собственный класс-обертку, который наследует SearchResultCollection или использует IDataContractSerializer . Оба решения кажутся нелегкими.

Вопрос: Как «стандартный» подход использовать классы .NET в качестве типа возврата в службе WCF?

(Написание собственного DataContract для моего собственного класса кажется простым.;))

Ответы [ 3 ]

3 голосов
/ 19 августа 2011

Здесь достаточно маршрута DataContract. Стандартный способ - украсить ваш класс соответствующими атрибутами, и он будет использован WCF в следующих методах:

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

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

Если класс не сериализуем, я не думаю, что даже перенос его будет работать.

Тем не менее, SearchResultCollection сам по себе возвращается из метода WCF, так что вы можете просто передать его прямо через ваш собственный сервис или, по крайней мере, успешно обернуть его.

1 голос
/ 19 августа 2011

Я думаю, что вам лучше всего создать свой собственный простой класс 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, я просто показываю пример.

0 голосов
/ 19 августа 2011

Думаю, я бы просто вернул Список пользователей, где Пользователь - это пользовательский класс, помеченный как Сериализуемый. Метод, который получает данные из активного каталога, может заполнить класс User, просматривая результат.

...