2016-05-02 15 views
0

私はWCFを初めて使用しており、カスタムオブジェクトのリストをシリアル化しようとしています。私はすでに他の記事でこのソリューションを試しています。WCFを使用してカスタムオブジェクトのリストをシリアル化するにはどうすればよいですか?

public List<Stage> getAllStages() 
{ 
    StageController sctrl = new StageController(); 
    Dictionary<int, Stage> sdict = sctrl.getAllStages(); 
    List<Stage> StageValueList = sdict.Values.ToList(); 
    StageListGetter sg = new StageListGetter(); 
    sg.StageList = StageValueList; 
    return sg.StageList; 
} 

と呼び出しに次のエラーがあります:

This could be due to the service endpoint binding not using the HTTP protocol. 
This could also be due to an HTTP request context being aborted by the server (possibly due 
to the service shutting down). See server logs for more details. 

私はこれを試してみましたサービスクラスで

[ServiceContract] 
[ServiceKnownType(typeof(List<Stage>))] 
public interface IUserService 
{ 
    [OperationContract] 
    void CreateUser(string name, string pwd, bool admin); 

    [OperationContract] 
    bool LogInUser(string name, string pwd); 

    [OperationContract] 
    List<Stage> getAllStages(); 

} 

    [DataContract] 
public class StageListGetter 
{ 
    private List<Stage> stageList; 

    [DataMember] 
    public List<Stage> StageList 
    { 
     get { return stageList; } 
     set { stageList = value; } 
    } 


} 

:ここ

は、サービス・インターフェース・コードであります私は行方不明ですか?

+0

Stageクラスのコードを入力してください。 –

+0

@RiadBaghbanli Stageクラスは、Entity Frameworkによって生成され、テーブルを表します。 – Vestilios

+0

@RiadBaghbanli私は結果の更新された答えを以下に掲載しました。 – Vestilios

答えて

0

簡単な解決方法は、Stageクラスの場合は[DataContract]となります。 Stageクラスを制御できない場合は、publicコンストラクタを使用して独自の[DataContract]クラスを作成し、Stageクラスのインスタンスを取り込み、そのコンテンツを[DataMember]要素にコピーします。

[ServiceContract] 
public interface IUserService 
{ 
    [OperationContract] 
    void CreateUser(string name, string pwd, bool admin); 

    [OperationContract] 
    bool LogInUser(string name, string pwd); 

    [OperationContract] 
    List<StageContract> getAllStages(); 
} 

public List<StageContract> getAllStages() 
{ 
    return (new StageController()) 
    .getAllStages() 
    .Values 
    .Select(s => new StageContract(s)) 
    .ToList(); 
} 
+0

私はこれを試してフィードバックを返します。ありがとうございました。 – Vestilios

0

* UPDATE:ここでは、完全な作業実装です:

私は次のようにコードを更新:

[ServiceContract] 
[ServiceKnownType(typeof(List<StageContract>))] 
public interface IUserService 
{ 
    [OperationContract] 
    void CreateUser(string name, string pwd, bool admin); 

    [OperationContract] 
    bool LogInUser(string name, string pwd); 

    [OperationContract] 
    List<StageContract> getAllStages(); 
} 

次のように私はデータコントラクトを作成:

[DataContract] 
public class StageContract 
{ 
    private int _stageID; 
    private int _projectID; 
    private int _wip; 
    private string _name; 
    private int _position; 

    public StageContract(Stage s) 
    { 
     StageID = s.ID; 
     ProjectID = s.ProjectID; 
     WIP = s.WIP; 
     Name = s.Name; 
     Position = s.Position; 
    } 

    [DataMember] 

    int StageID 
    { 
     get { return _stageID; } 
     set { _stageID = value; } 
    } 

    [DataMember] 
    int ProjectID 
    { 
     get { return _projectID; } 
     set { _projectID = value; } 
    } 

    [DataMember] 
    int WIP 
    { 
     get { return _wip; } 
     set { _wip = value; } 
    } 

    [DataMember] 
    string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    int Position 
    { 
     get { return _position; } 
     set { _position = value; } 
    } 
} 

サービスクラスはこのメソッドを持っています:

public List<StageContract> getAllStages() { 
     return (new StageController()) 
      .getAllStages() 
      .Values 
      .Select(s => new StageContract()) 
      .ToList(); 
    } 
関連する問題