通过WCF提供类对象的数组或列表

提供List或Array自定义类对象的WCF客户端服务器的任何示例都会对我有所帮助! 但到目前为止我得到的是:

这是我想要提供的class级系统

namespace NEN_Server.FS { [Serializable()] public class XFS { private List files; public XFS() { files = new List(); } public List Files { get { return files; } set { files = value; } } } } 

NFS在哪里

 namespace NEN_FS { public interface INFS : IEquatable { string Path { get; set; } } [Serializable()] abstract public class NFS : INFS { abstract public string Path { get; set; } public NFS() { Path = ""; } public NFS(string path) { Path = path; } public override bool Equals(object obj) { NFS other = obj as NFS; return (other != null) && ((IEquatable)this).Equals(other); } bool IEquatable.Equals(NFS other) { return Path.Equals(other.Path); } public override int GetHashCode() { return Path != null ? Path.GetHashCode() : base.GetHashCode(); } } } 

并提供方法是:

 namespace NEN_Server.WCF { public class NEN : INEN { private MMF mmf; public NEN() { mmf = new MMF(); } public string GetRandomCustomerName() { return mmf.MMFS.Files[0].Path; } public NFS[] ls() { return mmf.MMFS.Files.ToArray(); } 

接口是

  Public Interface INEN  Function GetRandomCustomerName() As String  Function ls() As NFS() 

最后我做了:

 %svcutil% /language:cs /out:NEN_Protocol\NEN.cs http://localhost:8080/NEN_Server 

它会产生:

 public NEN_FS.NFS[] ls() { return base.Channel.ls(); } 

我在我的客户端应用程序中调用它let files = nen.ls(),它失败了:

 An unhandled exception of type 'System.ServiceModel.CommunicationException' occurred in mscorlib.dll Additional information: The underlying connection was closed: The connection was closed unexpectedly. 

return base.Channel.ls(); 代码行。

注意提供字符串mmf.MMFS.Files[0].Path; 工作得很好

为什么? 我究竟做错了什么? 🙂

所有代码都可以在GitHub上找到: https : //github.com/nCdy/NENFS

在我看来,错误的原因在于: abstract public class NFS
首先,考虑使用与WCF的数据合同 :

 [DataContract(IsReference = true)] abstract public class NFS : INFS { [DataMember] abstract public string Path { get; set; } // the rest of code here } 

第二,为数据协定指定已知类型 。 通信通道两侧的序列化器必须知道如何对具体的NFS ‘后代类型进行seralize / deserialize:

 [DataContract(IsReference = true)] [KnownType(typeof(NFS1))] [KnownType(typeof(NFS2))] abstract public class NFS : INFS { [DataMember] abstract public string Path { get; set; } // the rest of code here } public class NFS1 : NFS {} public class NFS2 : NFS {}