1

1つのインターフェイスで複数の基本クラスを使用できるかどうかを知りたかっただけです。1つのインターフェイスに2つ(さらに多く)の基本クラスを使用しているという問題に直面しています。最初のものを使用してもまったく問題はありませんが、2番目のものを使用しようとすると、機能しません。

簡単にコードを書き留めます

[ServiceContract(Namespace = "http://bla.ServiceModel.Samples", SessionMode = SessionMode.Required)]
[ServiceKnownType(typeof(ObservableCollection<Models.Model1>))]
[ServiceKnownType(typeof(ObservableCollection<Models.MOdel2>))]
public interface IService
{
    [OperationContract]
    ObservableCollection<Models.Model1> AccessModel1();

    [OperationContract]
    ObservableCollection<Models.Model2> AccessModel2(string group);
}

クライアントに接続した後、Model1のコレクションを作成すると正常に機能します。Model2のコレクションを作成しようとすると、単にクラッシュします。内部例外は、「既存の接続がリモートホストによって強制的に閉じられた」です。

Model1と2には異なる情報が含まれていますが、構造は同じです。

根本的な間違いか何か他のものがありますか?

さらに詳しい情報が必要な場合は、大歓迎です!

アップデート

モデルクラスを投稿します。たぶん私はただ盲目で、エラーを見ることができません。

[DataContract]
public class Model2
{
    private string status;
    private string name;
    private string telephone;

    public Model2(string sStatus, string sName, string sTelephone)
    {
        Status = sStatus;
        Name = sName;
        Telephone = sTelephone;
    }

    [DataMember(IsRequired = true, Order = 0)]
    public string Status
    {
        get { return status; }
        set { status = value; }
    }

    [DataMember(IsRequired = true, Order = 1)]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    [DataMember(IsRequired = true, Order = 2)]
    public string Telephone
    {
        get { return telephone; }
        set { telephone = value; }
    }
}

internal class Model2Builder: ObservableCollection<Model2>
{
    public Model2Builder(string group)
        : base()
    {
        try
        {
            DataTable dt = new Database().GetModel2Data(group);

            foreach (DataRow row in dt.Rows)
            {
                Add(new Model2(row[0].ToString(), row[1].ToString(), row[2].ToString()));
            }

            dt.Dispose();
        }

        catch (Exception ex)
        {
            //Code for log...
        }
    }
}
4

2 に答える 2

2

ここで何をしようとしているのかわからない。モデルは基本クラスを実装していますか?

ServiceKnownTypeAttributeは、オブジェクトグラフに存在する可能性があり、サービスインターフェイスにはまだ存在しないタイプの階層を宣言することを目的としています。

インターフェースでModels1とModels2を既に公開しているため、ServiceKnownTypeAttributeでそれらを指定する必要はありません。

例えば:

[DataContract]
public class Shape { }

[DataContract]
public class Rectangle : Shape { }

[DataContract]
public class Square : Shape { }

[ServiceContract]
[ServiceKnownType(typeof(Rectangle))]
[ServiceKnownType(typeof(Square))]
public interface IService
{
    [OperationContract]
    Shape[] GetShapes();
}

public class Service : IService
{
    [OperationBehavior]
    public Shape[] GetShapes()
    {
        return new Shape[] {
            new Square(),
            new Rectangle()
        };
    }
}

KnowTypeAttributeを使用することもできることに注意してください:

[DataContract]
[KnownType(typeof(Rectangle))]
[KnownType(typeof(Shape))]
public class Shape { }

[DataContract]
public class Rectangle : Shape { }

[DataContract]
public class Square : Shape { }
于 2013-02-19T08:51:07.003 に答える
0

モデルクラスで、パラメーターなしのコンストラクターを追加しようとしましたか?データコントラクトシリアライザーに必要なパラメーターなしのコンストラクターが必要であると確信しています。

[DataContract]
public class Model2
{
    private string status;
    private string name;
    private string telephone;

    public Model2(){}

    public Model2(string sStatus, string sName, string sTelephone)
    {
        Status = sStatus;
        Name = sName;
        Telephone = sTelephone;
    }
    ...etc
于 2013-02-19T17:36:40.827 に答える