如何在 WCF 中 return 列表 <object>
How to return a List<object> in WCF
我的 WCF 服务 returning 数据采用 XML 和 JSON 格式。
一个函数必须return一个列表,因为我不知道哪个class会被用来填充这个列表。
所以,我有我的 class:
public class WrapHome
{
public WrapHome() { }
private string p_TITOLO { get; set; }
public string TITOLO { get { return p_TITOLO.ToString(); } set { p_TITOLO = value; } }
private List<object> p_CHART { get; set; }
public List<object> CHART { get { return p_CHART; } set { p_CHART = value; } }
}
和我的 WCF 声明:
[OperationContract]
[WebGet(UriTemplate = "datiHome.xml?token={token}&p1={p1}&p2={p2}", ResponseFormat = WebMessageFormat.Xml)]
List<WrapHome> GetDatiHomeXML(string token, string p1, string p2);
输出设置正确,但是,当它必须 return 时,它在 XML(或 JSON)中转换,它重新调用该方法并最终给出 err_connection_reset错误。
我知道问题出在列表上,因为如果我评论它,它就可以工作。如何在我的 WCF 输出中使用我的列表?
如果您需要更多详细信息,请毫无问题地问我。
你可以定义
[KnownType(typeof(MyChildObject0))]
...
[KnownType(typeof(MyChildObjectM))]
public class MyBaseObject { ... }
public class MyChildObject0 : MyBaseObject { ... }
...
public class MyChildObjectM : MyBaseObject { ... }
或者您可以只添加一次属性并定义一次 returns 所有 M+1 类型的静态方法。
并修改:
public class WrapHome
{
...
public List<MyBaseObject> CHART { get;set; }
}
在我的例子中,解决方案更简单。
我有一个 class,我在所有方法中都 return,像这样:
[DataContract]
public class Result
{
[DataMember]
public string KeyMensaje;
[DataMember]
public string ErrorMessage;
[DataMember]
public object Objeto;
...
}
问题是由于 class 中的 Objeto object
。此对象用于return变量类型,如果是复杂对象则无法序列化,例如:
res = new Result(list, "ok", "", "", "", null);
return res;
在本例中object (list)
是其他自定义对象的列表,例如List<CustomEmployee>
解决方案是在结果class上面添加object
的复杂类型,像这样:
[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
...
}
要使其正常工作,您的服务必须知道它需要序列化的类型。如果通过查看您的方法的签名无法找到它们(例如,因为一种类型是 object
),您需要列出可能在该 object
.
中的所有类型
将它们注释到您的服务顶部 class,如果您列出例如可以有 foo
、bar
和 baz
的实例:
[ServiceKnownType(typeof(foo))]
[ServiceKnownType(typeof(bar))]
[ServiceKnownType(typeof(baz))]
我的 WCF 服务 returning 数据采用 XML 和 JSON 格式。
一个函数必须return一个列表,因为我不知道哪个class会被用来填充这个列表。
所以,我有我的 class:
public class WrapHome
{
public WrapHome() { }
private string p_TITOLO { get; set; }
public string TITOLO { get { return p_TITOLO.ToString(); } set { p_TITOLO = value; } }
private List<object> p_CHART { get; set; }
public List<object> CHART { get { return p_CHART; } set { p_CHART = value; } }
}
和我的 WCF 声明:
[OperationContract]
[WebGet(UriTemplate = "datiHome.xml?token={token}&p1={p1}&p2={p2}", ResponseFormat = WebMessageFormat.Xml)]
List<WrapHome> GetDatiHomeXML(string token, string p1, string p2);
输出设置正确,但是,当它必须 return 时,它在 XML(或 JSON)中转换,它重新调用该方法并最终给出 err_connection_reset错误。
我知道问题出在列表上,因为如果我评论它,它就可以工作。如何在我的 WCF 输出中使用我的列表?
如果您需要更多详细信息,请毫无问题地问我。
你可以定义
[KnownType(typeof(MyChildObject0))]
...
[KnownType(typeof(MyChildObjectM))]
public class MyBaseObject { ... }
public class MyChildObject0 : MyBaseObject { ... }
...
public class MyChildObjectM : MyBaseObject { ... }
或者您可以只添加一次属性并定义一次 returns 所有 M+1 类型的静态方法。
并修改:
public class WrapHome
{
...
public List<MyBaseObject> CHART { get;set; }
}
在我的例子中,解决方案更简单。
我有一个 class,我在所有方法中都 return,像这样:
[DataContract]
public class Result
{
[DataMember]
public string KeyMensaje;
[DataMember]
public string ErrorMessage;
[DataMember]
public object Objeto;
...
}
问题是由于 class 中的 Objeto object
。此对象用于return变量类型,如果是复杂对象则无法序列化,例如:
res = new Result(list, "ok", "", "", "", null);
return res;
在本例中object (list)
是其他自定义对象的列表,例如List<CustomEmployee>
解决方案是在结果class上面添加object
的复杂类型,像这样:
[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
...
}
要使其正常工作,您的服务必须知道它需要序列化的类型。如果通过查看您的方法的签名无法找到它们(例如,因为一种类型是 object
),您需要列出可能在该 object
.
将它们注释到您的服务顶部 class,如果您列出例如可以有 foo
、bar
和 baz
的实例:
[ServiceKnownType(typeof(foo))]
[ServiceKnownType(typeof(bar))]
[ServiceKnownType(typeof(baz))]