【问题标题】:How to return a List<object> in WCF如何在 WCF 中返回 List<object>
【发布时间】:2016-09-21 18:44:43
【问题描述】:

我的 WCF 服务以 XML 和 JSON 格式返回数据。

一个函数必须返回一个列表,因为我不知道将使用哪个类来填充这个列表。

所以,我有我的课:

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);

输出设置正确,但是,当它必须以 XML(或 JSON)的形式返回时,它会重新调用该方法并最终给出 err_connection_reset 错误。

我知道问题出在列表上,因为如果我评论它,它就会起作用。如何在 WCF 输出中使用我的列表?

如果您需要更多详细信息,请毫无问题地问我。

【问题讨论】:

  • 您可以枚举所有可能最终出现在 List 中的类型,对吧?
  • @rudolf_franek 好吧,我想是的,可能的类型总共是 5 或 6,所以是的。为什么?
  • 你可以为你的对象定义一个基本类型,它应该被放入 List - 这个对象可以用 KnownTypeAttribute 标记 - 所有类型都作为参数列出.. - 或者 KnownTypes 可以在级别上定义服务/合同
  • @rudolf_franek 你有例子吗?没看懂。。
  • 好久没做WCF了,需要把[DataMember]加到WrapHome类的public List中吗?

标签: c# list wcf object connection-reset


【解决方案1】:

你可以定义

[KnownType(typeof(MyChildObject0))]
...
[KnownType(typeof(MyChildObjectM))]
public class MyBaseObject { ... }

public class MyChildObject0 : MyBaseObject { ... }
...
public class MyChildObjectM : MyBaseObject { ... }

或者您可以只添加一次属性并定义一次返回所有 M+1 类型的静态方法。

并修改:

public class WrapHome
{
  ...
  public List<MyBaseObject> CHART { get;set; }
}

【讨论】:

  • 现在我得到一个转换错误,在编译之前: var temp = new List(); temp.Add(new TortaTipoPageE("aaa", "1111")); temp.Add(new TortaTipoPageE("bbb", "2222")); var tt = new WrapHome() { }; tt.TITOLO = "普罗瓦"; tt.CHART = 温度; r.Add(tt);我做错了什么?
  • 你必须继承 TortaTipoPagE : MyBaseObject
【解决方案2】:

在我的情况下,解决方案更简单。

我有一个类,我在所有方法中都返回,如下所示:

[DataContract]
public class Result
    {

        [DataMember]
        public string KeyMensaje;
        [DataMember]
        public string ErrorMessage;        
        [DataMember]        
        public object Objeto;

        ...
   }

问题是由于这个类中的Objeto object。该对象用于返回变量类型,如果是复杂对象则不能序列化,例如:

res = new Result(list, "ok", "", "", "", null);  
return res;

在这种情况下object (list) 是其他自定义对象的列表,例如List&lt;CustomEmployee&gt;

解决方案是在 Result 类的顶部添加 object 可以是的复杂类型,如下所示:

[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
   ...
}

【讨论】:

    【解决方案3】:

    要使其工作,您的服务必须知道它需要序列化的类型。如果无法通过查看方法的签名找到它们(例如,因为一种类型是 object),则需要列出可能在该 object 中的所有类型。

    将它们注释到您的服务类的顶部,例如,如果您列出可以有 foobarbaz 的实例:

    [ServiceKnownType(typeof(foo))]
    [ServiceKnownType(typeof(bar))]
    [ServiceKnownType(typeof(baz))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-11
      • 2016-06-13
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      相关资源
      最近更新 更多