2012-03-19 67 views
2

我正在開發一個WCF服務,該服務設計爲由執行收費操作的非.NET客戶端使用。我希望能夠根據用例返回基類DataContract或繼承類DataContract。WCF DataContract:根據場景返回基類或繼承類

所以我必須:

[DataContract] 
public class ChargeResponse 
{ 
    [DataMember] 
    public string ID 

    [DataMember] 
    public string Description 
} 

對於成功的操作,我想回有一個額外的數據成員,如繼承類型:

[DataContract] 
public class SuccessfulChargeResponse : ChargeResponse 
{ 
    [DataMember] 
    public string TransactionID 
} 

對於所有其他情況下,我會回來的低音類。這可能嗎?或者,我應該讓DataMember是基類,並返回一個空值。

+0

任何具體的推理這個鏈接,以這種方法嗎?你可能認爲'TransactionID'只是'[DataMember(IsRequired = false)]' – f0x 2012-03-19 09:23:51

+0

這是我的第一個WCF服務,所以我想我有很多東西要學習:)如果我使用你的方法,參數只會序列化,如果它有一個值? – 2012-03-19 09:35:10

+0

謝謝f0x,這個訣竅:) – 2012-03-19 10:05:26

回答

1

您現在的位置過於複雜 - 你只需要返回ChargeResponse包含TransactionID。如果操作成功TransactionID將具有值,則如果不是那麼TransactionID將爲空。您可以進一步擴展您的類,以包含指示成功的標誌或枚舉,以及您需要指出錯誤的屬性。

這就是所謂的請求/響應模式,很常見。一些(可能很沉悶的,不一定很新)鏈接描述此:

1

我認爲這是一個基於SOAP的服務?如果是這樣,提醒消費者他們有義務處理的錯誤或不成功條件的正確方法是在服務定義上公開錯誤合同。然後,您可以簡單地引發異常,讓消費者捕獲異常,就像服務操作是進程內方法時那樣。

爲此使用FaultContract屬性,在服務定義:

[OperationContract] 
[FaultContract(typeof(MyChargeServiceExceptionType))] 
ChargeResponse Charge(ChargeRequest request); 
3

是的,它是可能的。請嘗試考慮以下回復 關鍵是在數據合同上使用屬性'KnownType()。

詳細說明:在基類的頂部使用[KnownType(typeof(SuccessfulChargeResponse))]屬性。 該屬性有助於序列化引擎將SuccessfulChargeResponse標記爲ChargeResponse基類的派生類型。

既然DataContract標有它的派生類型,該響應可以是鹼型或派生類型

希望這有助於的。好運:)

參考參考 http://msdn.microsoft.com/en-us/library/ms730167.aspx

+0

另請參閱[ServiceKnownTypeSttribute](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.serviceknowntypeattribute.aspx)。 – 2012-05-02 12:54:30