2013-06-12 3 views
0

У меня есть WCFService, которая возвращает различные другие типы данных в таком роде образом:Клиент Visual Studio WCF создает классы с отсутствующими свойствами, добавляет ExtensionData свойства вместо

[DataContract(Name="Amazing", NameSpace="http://schemas.myorganisation.com/DataContract1")] 
Public class AmazingDto 
{ 
    [DataMember(Order=0, IsRequired=true)] 
    public string Name { get; set; } 

    [DataMember(Order=0, IsRequired=true)] 
    public bool IsAmazing { get; set; } 

} 

А потом

[DataContract (Name="GetAmazingListResponse", NameSpace="http://schemas.myorganisation.com/DataContract1")] 
Public class GetAmazingListResponseDto 
{ 
    [DataMember(Order=0, IsRequired-true, EmitDefaultValue=False)] 
    public ICollection<AmazingDto> AmazingList{ get; set; } 
} 

Также

[DataContract(Name = "Response", Namespace = "http://schemas.myorganisation.com/DataContract1")] 
public class ResponseDto<TData> : BaseResponseDto 
{ 
    public ResponseDto(); 

    [DataMember(Order = 0, IsRequired = true)] 
    public StatusDto Status { get; set; } 

    [DataMember(Order = 1, IsRequired = false, EmitDefaultValue = false)] 
    public TData Data { get; set; } 
} 

А потом

public ResponseDto<GetAmazingListResponseDto> GetAmazingList() 
{ 
     var response = new ResponseDto<GetAmazingListDto> 
     { 
      Status = new StatusDto { StatusResult = StatusResultEnum.Success }, 
      Data = new GetAmazingListResponseDto 
       { 
        AmazingList = new List<AmazingDto> 
         { 
          new AmazingDto { Name="Ponies", IsAmazing=true }, 
          new AmazingDto { Name="Glenatron", IsAmazing=false } 
         } 
       } 
     }; 
     return response; 
} 

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

<GetAmazingListResult xmlns:a="http://schemas.myorganisation.com/DataContract1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <a:Status> 
      <a:StatusResult>Success</a:StatusResult> 
     </a:Status> 
     <a:Data xmlns:b="http://schemas.myorganisation.com/DataContract1"> 
      <b:AmazingList> 
       <b:Amazing> 
       <b:Name>Ponies</b:Name> 
       <b:IsAmazing>true</b:IsAmazing> 
       </b:Amazing> 
       <b:Amazing> 
       <b:Name>Glenatron</b:Name> 
       <b:IsAmazing>false</b:IsAmazing> 
       </b:Amazing> 
      </b:AmazingList> 
     </a:Data> 
    </GetAmazingListResult> 

Однако, когда я использую Visual Studio 2010 для создания Service Reference и сделать вызов, как это:

var client= new FindoutAmazingnessServiceClient(); 
var response = client.GetAmazingList(); 

Что я нахожу, что response имеет только два свойства, Status и ExtensionData. Я видел это, описанное в других вопросах SE, но ответ всегда заключался в том, что что-то отсутствовало. DataContract или DataMember по контрактам данных. У меня определенно есть те, поэтому что-то еще должно происходить, чтобы VS.Net не мог видеть мои классы. Я попытался обратиться к библиотеке DTO, содержащей эти файлы, и попытаться настроить ссылку для соответствия типам с этой библиотекой, но это не имеет никакого значения.

Куда я иду не так?

+0

Вы указываете OperationContract где угодно? – STLDeveloper

+0

Yup, OperationContract находится на интерфейсе, который реализует класс сервиса. – glenatron

ответ

0

Решение, которое я нашел, поскольку я работаю против своей собственной службы WCF, импортировать интерфейсы в свой клиент, а затем использовать ChannelFactory для настройки соединения. Это очень хорошо работает в моем сценарии, но не решает проблему, которую я поднимаю с этим вопросом.

1

Просто добавьте [DataMember] к своим членам данных. Это решило мою проблему.