DataContract在WCF客户端服务引用中不可用

时间:2013-08-17 08:33:36

标签: c# windows wcf service datacontract

我的WCF服务中有此数据合约

[DataContract]
public class Department
{
    [DataMember]
    public List<Section> Sections { get; set; }
}


[DataContract]
public class Section
{
    [DataMember]
    public List<Room> Rooms { get; set; }
}

[DataContract]
public class Room
{
    [DataMember]
    public uint RoomId { get; set; }
}

当我在客户端应用程序中引用我的服务时,我只看到Room类,任何机构都可以解释为什么客户端无法获得Department和Section类的合同。

1 个答案:

答案 0 :(得分:13)

ServiceContract界面中添加与Department相关的单个操作,这将使DepartmentSection对您的客户端应用程序可见。

由于Department包含Sections列表,因此它也会公开Section。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Room GetRoom();

    [OperationContract]
    List<Department> GetDepartments();
}

说明

您可以使用Svcutil.exe验证它。

如果用户定义的类没有操作合同,则使用Svcutil生成definition won't emit in proxy class

如果省略Department的第二个操作合同,则只有Room类在代理类中发出。因此,您需要在您的班级上至少有一个操作合同,以使其对您的客户可见。

房间的PROXY课程:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", 
                                                  "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Room", 
             Namespace="http://schemas.datacontract.org/2004/07/DummyService")]
public partial class Room : object,
                System.Runtime.Serialization.IExtensibleDataObject
{        
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;        
    private uint RoomIdField;        
    public System.Runtime.Serialization.ExtensionDataObject ExtensionData
    {
        get
        {
            return this.extensionDataField;
        }
        set
        {
            this.extensionDataField = value;
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute()]
    public uint RoomId
    {
        get
        {
            return this.RoomIdField;
        }
        set
        {
            this.RoomIdField = value;
        }
    }
}