2

カスタムクラスオブジェクトのリストまたは配列を提供するWCFクライアントサーバーの例は、私を助けてくれます! しかし、ここに私がこれまでに得たものがあります:

これが私が提供したい私のクラスシステムです

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

NFS の場所

namespace NEN_FS {
    public interface INFS : IEquatable<NFS> {
        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<NFS>)this).Equals(other);
            }
        bool IEquatable<NFS>.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();
            }

インターフェイスは

<ServiceContract>
Public Interface INEN
    <OperationContract>
    Function GetRandomCustomerName() As String
    <OperationContract()>
    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

4

1 に答える 1

2

私には、その障害の理由はここにあるようです: 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
}

2 つ目は、データ コントラクトの既知の型を指定します。通信チャネルの両側のシリアライザーは、具体的なNFS' 子孫型をシリアライズ/デシリアライズする方法を知っている必要があります。

[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 {}
于 2012-08-21T12:53:33.073 に答える