[英]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.