基类成员未在WCF服务引用中公开

时间:2016-07-12 21:31:30

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

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

Add a service reference

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

以下是我的类型界面:

[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派生类中公开吗?

2 个答案:

答案 0 :(得分:0)

我建议您尝试针对接口编写代码,但我发现无法通过WCF执行此操作。我仍然针对接口进行编程,但是在WCF级别,我包含转换代码,该代码接受Interface实例并将其转换为等效的WCF模型。

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

谢谢, Jibba

答案 1 :(得分:0)

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

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

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

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