【问题标题】:Base class members not being exposed in WCF service reference未在 WCF 服务参考中公开的基类成员
【发布时间】:2016-07-12 21:31:29
【问题描述】:

为了使用 WCF SOAP 服务,我使用的是 VS2015 中的“添加服务引用”工具。

问题是当以这种方式添加服务引用时,基类的成员不会暴露在派生类中。

这是我的类型的界面:

[ServiceKnownType(typeof(DbEntry))]
public interface ILogEntry
{
    [DataMember]
    Int64 Id { get; set; }

    [DataMember]
    String Error { get; set; }

    [DataMember]
    String CustomMessage { get; set; }

    [DataMember]
    Int32 ApplicationId { get; set; }

    Int32 ServiceId { get; set; }

    [DataMember]
    Guid ApplicationGuid { get; set; }

    [DataMember]
    String ApplicationName { get; set; }
...etc.

这里是实现接口的基类:

[DataContract]
[KnownType(typeof(DbEntry))]
public abstract class LogEntry : ILogEntry
{
    private Int64 _Id;
    [DataMember]
    public Int64 Id
    {
        get { return _Id; }
        set { _Id = value; }
    }

    private String _Error;
    [DataMember]
    public String Error
    {
        get { return _Error; }
        set { _Error = value; }
    }

    private String _CustomMessage;
    [DataMember]
    public String CustomMessage
    {
        get { return _CustomMessage; }
        set { _CustomMessage = value; }
    }

    private Int32 _ApplicationId;
    [DataMember]
    public Int32 ApplicationId
    {
        get { return _ApplicationId; }
        set { _ApplicationId = value; }
    }

    private Int32 _ServiceId;
    public Int32 ServiceId
    {
        get { return _ServiceId; }
        set { _ServiceId = value; }
    }

    private Guid _ApplicationGuid;
    [DataMember]
    public Guid ApplicationGuid
    {
        get { return _ApplicationGuid; }
        set { _ApplicationGuid = value; }
    }
...etc

这是我的派生类:

[DataContract]
public class DbEntry : LogEntry
{        
    private String _Message;
    [DataMember]
    public String Message
    {
        get { return _Message; }
        set { _Message = value; }
    }
}

在客户端中,在 DbEntry 类中公开的唯一数据成员是 Message。当我使用通过直接访问 WSDL 生成的 CS 文件时,一切正常。

谁能告诉我为什么当我使用“添加服务引用”工具时基类成员没有暴露在 DbEntry 派生类中?

【问题讨论】:

    标签: c# .net web-services wcf soap


    【解决方案1】:

    我赞扬您尝试针对接口编写代码,但我发现在 WCF 之外执行此操作是不可能的。我仍然针对接口进行编程,但在 WCF 级别,我包含了转换代码,该代码采用接口实例并将其转换为等效的 WCF 模型。

    当您发现服务时,它只会根据它可以传入或接收的内容创建对象。您的问题还涉及继承,因为 WCF 也不会为您推断。您必须将 LogEntry 和 DbEntry 作为单独的对象引用,这些对象可以通过服务函数传入或返回。换句话说,您应该有一个单独的 LogEntry 和 DbEntry 操作合同。

    谢谢, 吉巴

    【讨论】:

      【解决方案2】:

      它是您的 WCF 服务吗?如果是这样,请将服务的模型和接口放在单独的项目中,并从 WCF 服务和客户端应用程序中引用该库。我经常把它命名为MyServiceName.Interface

      (即使它不是您的 WCF 服务,但您可以从客户端应用程序中引用模型,这仍然有效。)

      然后,在添加服务引用时,点击“高级”,确保勾选“在引用的程序集中重用类型”。

      然后,当您添加引用并创建代理类时,它将重用您在接口库中声明的模型。 [DataContract][DataMember] 属性无关紧要。因为您使用的是您定义的确切类(而不是创建新的代理类),所以您继承的属性将是可访问的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多