【问题标题】:WCF and subclassesWCF 和子类
【发布时间】:2009-03-13 22:49:06
【问题描述】:

我有这个服务合同

[OperationContract(IsOneWay=true)]
void ProcessMessage(Message message);

还有这些物品

[DataContract]
public class Message
{
    [DataMember]
    public long Id { get; set; }

    [DataMember]
    public string Body { get; set; }
}

[DataContract]
public class ExtendedMessage : Message
{       
    [DataMember]
    public NameValueCollection AdditionalData { get; set; }
}

如果我将子类传递给服务方法,WCF 是否能够处理?还是会丢弃所有不在基类中的额外属性?

ExtendedMessage msg = new ExtendedMessage();
...
ProcessMessage(msg);

【问题讨论】:

  • 你有没有达到这个效果?我与这些主题斗争了很长时间。是否有可能在 [OperationContract] HandleData(Base base);并从 SoapUI 发送一些来自 Base 的驱动对象?然后如果 c# 会意识到它在基础上是持有某个子类的实例 - 所以它也会调用适当的方法(多态性等)

标签: c# .net wcf


【解决方案1】:

我认为如果你没有通过 KnownType 属性指定 ExtendedMessage,你会得到一个错误。一旦您通过 KnownType 将 ExtendedMessage 告知 WCF,它就会工作而不会丢失数据。

顺便说一句,您不需要在编译时知道可能的类型集,因为 KnownType 属性可以引用一个方法,该方法将在运行时返回可能的类型集。

【讨论】:

  • 我与这些主题斗争了很长时间。是否有可能在 [OperationContract] HandleData(Base base);并从 SoapUI 发送一些来自 Base 的驱动对象?然后如果 c# 会意识到它在基础上是持有某个子类的实例 - 所以它也会调用适当的方法(多态性等)
【解决方案2】:

您还可以使用 ServiceKnownType 属性来缩小 KnownType 属性的范围。您可以将 ServiceKnownType 属性应用于特定操作或服务合同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多