为了使用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派生类中公开吗?
答案 0 :(得分:0)
我建议您尝试针对接口编写代码,但我发现无法通过WCF执行此操作。我仍然针对接口进行编程,但是在WCF级别,我包含转换代码,该代码接受Interface实例并将其转换为等效的WCF模型。
当您发现服务时,它只会根据传入或接收的内容创建对象。您的问题也涉及继承,因为WCF也不会为您推断。必须将LogEntry和DbEntry都引用为可以传入或由服务函数返回的单独对象。换句话说,你应该有一个单独的LogEntry和DbEntry操作合同。
谢谢, Jibba
答案 1 :(得分:0)
是你的WCF服务吗?如果是这样,请将服务的模型和接口放在单独的项目中,并从WCF服务和客户端应用程序引用该库。我经常将其命名为MyServiceName.Interface
。
(即使它不是您的WCF服务,但您可以从客户端应用程序中引用模型,这仍然有效。)
然后,在添加服务引用时,单击“高级”并确保选中“在引用的程序集中重用类型”。
然后,当您添加引用并创建代理类时,它将重用您的接口库中声明的模型。 [DataContract]
和[DataMember]
属性无关紧要。因为您正在使用您定义的确切类(不创建新的代理类),所以可以访问您继承的属性。