我有一个WCFService,它以这种方式返回各种类型的数据:
[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创建服务引用并进行如下调用时:
var client= new FindoutAmazingnessServiceClient();
var response = client.GetAmazingList();
我发现response
只有两个属性,Status
和ExtensionData
。我已经在其他SE问题中看到了这一点,但答案总是在数据契约上缺少 DataContract 或 DataMember 。我肯定有那些,所以必须发生其他事情,以便VS.Net看不到我的课程。我尝试引用包含这些文件的DTO库,并尝试配置与该库匹配类型的引用,但它没有区别。
我哪里错了?
答案 0 :(得分:1)
只需将[DataMember]添加到您的数据成员即可。它解决了我的问题。
答案 1 :(得分:0)
我找到的解决方案是,当我正在使用自己的WCF服务时,将接口导入我的客户端,然后使用ChannelFactory来建立连接。这在我的场景中非常有效,但是没有解决我在这个问题上提出的问题。