【问题标题】:DataContract not available at WCF client service referenceDataContract 在 WCF 客户端服务参考中不可用
【发布时间】:2013-08-17 08:33:35
【问题描述】:

我的 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 类的合同在客户端不可用。

【问题讨论】:

  • 您是否重新加载了您的服务?我几乎可以肯定您已经引用了没有 SectionDepartment 类的旧版本的服务。您需要发布最新版本的服务,然后在其他项目中重新加载参考。
  • 是的,我已经尝试使用更新的服务参考,但我仍然只获得 Room 类。我看到的唯一区别是 Room 类具有本机类型,但其他类具有用户定义的类型。
  • 我在 Department 和 Section Class 的 Datacontract 属性下方使用了 KnownType 标签,但客户端仍然没有出现任何内容。我尝试在我的服务接口中使用虚拟操作合同,它返回这些用户定义的类型,然后我可以在客户端查看这些类型的定义。是否需要为用户定义的类提供操作合同才能在客户端查看它们?
  • @TRS - 这是个好问题;可能是,因为未使用的数据合同可能不被视为元数据的一部分。我建议添加一些使用其他数据协定的操作,看看会发生什么。

标签: c# windows wcf service datacontract


【解决方案1】:

在您的ServiceContract 界面中添加一个与Department 相关的单个操作,这将使您的客户端应用程序可以看到DepartmentSection

由于 Department 包含 Section 列表,它也会暴露 Section。

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

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

说明

您可以使用Svcutil.exe进行验证。

如果用户定义的类不存在操作契约,则使用 Svcutil 生成其definition won't emit in proxy class

如果我省略了Department 的第二个操作契约,代理类中只会发出Room 类。所以,你需要在你的类上至少有一个操作契约,让它对你的客户可见。

房间的代理类:

[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;
        }
    }
}

【讨论】:

  • 有什么来源可以支持这个吗?
  • 更新:我试过了,它确实有效。仍然有一些关于这个主题的文献会很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多