繁体   English   中英

WCF服务合同和数据合同

[英]WCF Service Contracts and Data Contracts

我正在开发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的类?

你超载

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

您是否没有获得正确的参数类型并以错误的方式命名,即不应该

OriginalLoadRequest OriginalRequest);

甚至

OriginalLoadRequest OriginalLoadRequest);

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

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

这个类似的问题帮助: 如何在WCF中返回List <object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM