WCF服务合同和数据合同

时间:2019-03-12 12:28:56

标签: c# wcf

我正在开发WCF服务。该服务必须支持的方法由第三方定义。定义服务合同的接口部分看起来像这样:

[SoapHeaders]
[ServiceContract(Namespace ="abc.xyz")]
public interface IAbcSoap
{
    [SoapHeader("AuthenticationHeader", 
        typeof(AuthenticationHeader), 
        Direction = SoapHeaderDirection.In)]
    [OperationContract(Action = "abc.xyz/ReverseCard")]
    ReverseCardResponse ReverseCard(
        OriginalRequest OriginalRequest);

定义数据协定的类包括OriginalRequest和继承自OriginalRequest的其他几种特定类型,例如:

[DataContract]
public class OriginalRequest
{
    [DataMember]
    public MessageHeader MsgHeader { get; set; }
}

[DataContract]
public class OriginalLoadRequest : OriginalRequest
{
    [DataMember]
    public long ProductCode { get; set; }
}

我有一个测试客户端程序,该程序是使用SvcUtil根据服务生成的WSDL创建的。我的问题是,从WSDL生成的代码仅包含OriginalRequest,而不包含从OriginalRequest继承的类似OriginalLoadRequest之类的类,大概是因为在接口中没有对这些类的引用。我试图像这样向接口添加重载:

[OperationContract(Action = "abc.xyz/ReverseCard")]
ReverseCardResponse ReverseCard(
    OriginalRequest OriginalLoadRequest);

但这会在尝试生成WSDL时导致错误。如果我理解正确,这是因为我不能同时执行两种方法。但是动作是由第三方定义的。我无法更改。

如何使客户端程序了解OriginalLoadRequest以及从OriginalRequest继承的其他类?

1 个答案:

答案 0 :(得分:0)

我相信已经找到了答案。看来我需要的是KnownType属性:

[DataContract]
[KnownType(typeof(OriginalConfirmRequest))]
[KnownType(typeof(OriginalLoadRequest))]
[KnownType(typeof(OriginalRedeemRequest))]
[KnownType(typeof(OriginalVoidRequest))]
public class OriginalRequest
{
    [DataMember]
    public MessageHeader MsgHeader { get; set; }
}

这个类似的问题帮助: How to return a List<object> in WCF