Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回列表<;对象>;在WCF中_C#_List_Wcf_Object_Connection Reset - Fatal编程技术网

C# 如何返回列表<;对象>;在WCF中

C# 如何返回列表<;对象>;在WCF中,c#,list,wcf,object,connection-reset,C#,List,Wcf,Object,Connection Reset,我的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; } }

我的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; } }
}
公共类包装盒
{
公共WrapHome(){}
私有字符串p_TITOLO{get;set;}
公共字符串TITOLO{get{return p_TITOLO.ToString();}set{p_TITOLO=value;}}
私有列表p_图{get;set;}
公共列表图表{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);
[运营合同]
[WebGet(UriTemplate=“datiHome.xml?token={token}&p1={p1}&p2={p2}”,ResponseFormat=WebMessageFormat.xml)]
列出GetDatiHomeXML(字符串标记、字符串p1、字符串p2);
输出设置正确,但是当它必须返回转换为XML(或JSON)的输出时,它会重新调用该方法,最后给出err_connection_reset错误

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

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

您可以定义

[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; }
}
公共类包装盒
{
...
公共列表图表{get;set;}
}
您可以定义

[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; }
}
公共类包装盒
{
...
公共列表图表{get;set;}
}

在我的例子中,解决方案更简单

我有一个类,我在我的所有照片中返回,如下所示:

[DataContract]
public class Result
    {

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

        ...
   }
[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
   ...
}
该问题是由于该类中的
Objeto object
引起的。此对象用于返回变量类型,如果是复杂对象,则无法序列化,例如:

res = new Result(list, "ok", "", "", "", null);  
return res;
在这种情况下,
object(list)
是其他自定义对象的列表,例如
list

解决方案是将
object
可以是的复杂类型添加到顶级结果类中,如下所示:

[DataContract]
public class Result
    {

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

        ...
   }
[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
   ...
}
[DataContract]
[知识类型(类型(列表))]
[KnownType(typeof(CustomEmployee))]
公开课成绩
{
...
}

在我的例子中,解决方案更简单

我有一个类,我在我的所有照片中返回,如下所示:

[DataContract]
public class Result
    {

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

        ...
   }
[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
   ...
}
该问题是由于该类中的
Objeto object
引起的。此对象用于返回变量类型,如果是复杂对象,则无法序列化,例如:

res = new Result(list, "ok", "", "", "", null);  
return res;
在这种情况下,
object(list)
是其他自定义对象的列表,例如
list

解决方案是将
object
可以是的复杂类型添加到顶级结果类中,如下所示:

[DataContract]
public class Result
    {

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

        ...
   }
[DataContract]
[KnownType(typeof(List<CustomEmployee>))]
[KnownType(typeof(CustomEmployee))]
public class Result
{
   ...
}
[DataContract]
[知识类型(类型(列表))]
[KnownType(typeof(CustomEmployee))]
公开课成绩
{
...
}

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

例如,如果您列出了
foo
bar
baz
的实例,请将它们注释到服务类的顶部:

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

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

例如,如果您列出了
foo
bar
baz
的实例,请将它们注释到服务类的顶部:

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

你可以列举列表中所有可能的类型,对吧?@rudolf_franek嗯,我想是的,可能的类型总共有5或6种,所以是的。为什么?您可以为对象定义一个应放入列表中的基类型-此对象可以用KnownTypeAttribute标记-所有类型都列为参数..-或者可以在服务级别上定义KnownTypes/contract@rudolf_franek你有一个例子吗?我不太明白..有一段时间没有做WCF了,但是你需要将[DataMember]添加到WrapHome类的公共列表中吗?你可以枚举列表中所有可能的类型,对吧?@rudolf_franek嗯,我想是的,可能的类型总共有5或6个,所以是的。为什么?您可以为对象定义一个应放入列表中的基类型-此对象可以用KnownTypeAttribute标记-所有类型都列为参数..-或者可以在服务级别上定义KnownTypes/contract@rudolf_franek你有一个例子吗?我不太了解..有一段时间没有做WCF,但是您需要将[DataMember]添加到WrapHome类的公共列表中吗?现在,在编译之前,我得到一个转换错误:var temp=new List();临时添加(新的TortaTipoPagE(“aaa”、“1111”);临时添加(新TortaTipoPagE(“bbb”、“2222”));var tt=new WrapHome(){};tt.TITOLO=“prova”;tt.CHART=温度;r、 增加(tt);我做错了什么?您必须继承TortaTipoPagE:MyBaseObjectNow我在编译之前遇到一个转换错误:var temp=new List();临时添加(新的TortaTipoPagE(“aaa”、“1111”);临时添加(新TortaTipoPagE(“bbb”、“2222”));var tt=new WrapHome(){};tt.TITOLO=“prova”;tt.CHART=温度;r、 增加(tt);我做错了什么?你必须继承TortaTipoPagE:MyBaseObject