我正在构建一个WCF。我有一个名为Result
public class ReturnData
{
public string key { get; set; }
public string[] value { get; set; }
}
public class TagDetailData
{
public string key { get; set; }
public string description { get; set; }
}
public object Data { get; set; }
回复会返回属性Data
,我希望能够在回复中将List<ReturnData>
或List<TagDetailData>
转换为Data
。
客户要求结果全部在Data
,并根据他们的输入我处理ReturnData
或TagDetailData
。
我可以将List转换为对象吗?也许我需要另一种方法?
当我尝试
时var newData = new List<TagDetailData>();
newData.Add(new TagDetailData
{
key = "Test",
description = "Tester"
});
this.Data = (List<TagDetailData>)newData;
该服务无法加载响应数据,我没有得到任何异常。
答案 0 :(得分:2)
对于WCF有效负载,您需要比“对象”更具体。尝试使用这样的通用包装:
public class Result<T> where T : class
{
public Result() { }
public Result(T data)
{
this.Data = data;
}
public T Data { get; set; }
}
这样,您可以创建所需类型的结果,例如:
var data = new List<TagDetailData>();
data.Add(new TagDetailData
{
key = "Test",
description = "Tester"
});
return new Result<List<TagDetailData>>(data);
T的类型可以由构造函数在这里推断,<ListTagDetailData>>
实际上是不必要的。我在这里说明数据是任何类型的数据。此外,此类中仍然需要无参数构造函数,以使序列化程序正常工作。
WFC序列化程序无法序列化类型“object”或键入“dynamic”。这就是您的合约方法不产生任何产出的原因。泛型类型解析为可自行序列化的实际类型。
有人建议您使用基类。我没试过这个,但我怀疑它不会起作用,因为数据合同与你实际尝试序列化的内容不符。
自从我在WCF工作以来已经有一段时间了。您可能需要使用DataContract和DataMember属性修饰Result包装器。
如果您的端点严格基于Web(HTTP和HTTPS),请考虑使用WebAPI。
答案 1 :(得分:1)
您是否尝试启用WCF日志记录?见how-to-turn-on-wcf-tracing
您可能需要添加属性来告诉data-contract-serializer期望的数据类型。例如,请参阅此MSDN blog
答案 2 :(得分:1)
你可以选择:
public class ReturnItem
{
public string key { get; set; }
public string description { get; set; }
public string[] value { get; set; }
}
public ReturnItem[] Data { get; set; }
稍后,您可以测试description
的空值并找出它的对象;可选地,您可以添加枚举属性以明确区别。