一个接口中的WCF多个基类?

时间:2013-02-19 07:46:19

标签: c# wcf datacontract

我只是想知道是否可以在一个界面中使用多个基类。我面临的问题是我正在使用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...
        }
    }
}

2 个答案:

答案 0 :(得分: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()
        };
    }
}

请注意,您也可以使用KnownTypeAttribute

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

[DataContract]
public class Rectangle : Shape { }

[DataContract]
public class Square : Shape { }

答案 1 :(得分: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