簡體   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