WCF服务合同和数据合同

问题描述 投票:0回答:2

我正在开发一个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; }
}

我有一个测试客户端程序,使用服务生成的WSDL中的SvcUtil创建。我的问题是,从WSDL生成的代码只包含OriginalRequest,而不是像OriginalLoadRequest那样继承自OriginalRequest的类,可能是因为在接口中没有对这些类的引用。我尝试在接口中添加一个重载,如下所示:

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

但是这在尝试生成WSDL时会导致错误。如果我理解正确,这是因为我不能有两个具有相同动作的方法。但该行动是由第三方定义的。我无法改变这一点。

我该怎么做才能使客户端程序知道OriginalLoadRequest和从OriginalRequest继承的其他类?

c# wcf
2个回答
0
投票

在你的超载,

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

你有没有参数类型和错误的方式命名,即不应该

OriginalLoadRequest OriginalRequest);

甚至

OriginalLoadRequest OriginalLoadRequest);

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

© www.soinside.com 2019 - 2024. All rights reserved.