【问题标题】:WCF Service Contracts and Data ContractsWCF 服务合同和数据合同
【发布时间】:2019-03-12 12:28:56
【问题描述】:

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


    【解决方案1】:

    在你的超载中,

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

    你是不是弄错了参数类型和名称,即不应该是这样

    OriginalLoadRequest OriginalRequest);
    

    甚至

    OriginalLoadRequest OriginalLoadRequest);
    

    【讨论】:

    • 是的,谢谢,我相信你是对的。但是,如果我理解正确,我认为我无论如何都不能使用重载,因为我认为我不能有两种方法来实现相同的操作。使用 KnownType 属性似乎已经修复了它。但感谢您抽出宝贵时间提供帮助。
    【解决方案2】:

    我相信我已经找到了答案。看起来我需要的是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多