У меня есть 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, содержащей эти файлы, и попытаться настроить ссылку для соответствия типам с этой библиотекой, но это не имеет никакого значения.
Куда я иду не так?
Вы указываете OperationContract где угодно? – STLDeveloper
Yup, OperationContract находится на интерфейсе, который реализует класс сервиса. – glenatron