2012-10-01 52 views
3

我正在編寫一個WCF webservice並傳入一個複雜類型作爲該方法的參數。複雜類型看起來像這樣:WCF - 無法創建抽象類

[DataContract(Namespace = "")] 
public class MyRequest 
{ 
    [DataMember()] 
    public string TransactionId { get; set; } 

    [DataMember(IsRequired = true)] 
    public bool IsRollback { get; set; } 

    [DataMember(IsRequired = true)] 
    public OrderType OrderType { get; set; } 

    [DataMember(IsRequired = true)] 
    public ICustomerId CustomerId { get; set; } 

    [DataMember()] 
    public long OrderId { get; set; } 

    [DataMember()] 
    public AnotherComplexType PurchaseInfo { get; set; } 

的web服務方法看起來像這樣:

[ServiceKnownType(typeof(CustomerIdByName))] 
[ServiceKnownType(typeof(CustomerIdByAccount))] 
public OrderResult Execute(MyRequest order) { 
} 

界面看起來像這樣:

[KnownType(typeof(CustomerIdByAccount))]  
[KnownType(typeof(CustomerIdByName))] 
public interface ICustomerId{ 

string GetId(); 
} 

當我讓使用SOAP端的請求點,一切都很好。但是,當將請求傳遞給REST端點時,會出現序列化錯誤。

這是我使用

<MyRequest> 
<CustomerId> 
<AccountId>59251</AccountId> 
</CustomerId> 
<IsRollback>false</IsRollback> 
<OrderId>0</OrderId> 
<OrderType>OrderSubscription</OrderType> 
<PurchaseInfo> 
<ObjectId>196521</ObjectId> 
</PurchaseInfo> 
<TransactionId>ABC123</TransactionGuid> 
</MyRequest> 

因爲我一直停留在這一點上太久的要求,我再變ICustomerId成員是實現ICustomerId一個抽象類。 SOAP端點再次正常工作,但將請求發送到其餘端點,我得到一個錯誤,指出「無法創建抽象類」

我在這裏丟失或做錯了什麼?

這是否失敗,因爲接口嵌套在複雜類型中,而不是webservice方法的直接參數?我已經使用接收接口作爲參數的webservices,並使用它們工作的KnownType裝飾器就好了。同樣的問題適用於抽象類,這是不是工作,因爲抽象類嵌套在MyRequest複雜類型的成員內?

這是錯誤消息我得到:從命名空間

元客戶ID不能有小孩內容被反序列化的對象。請使用XmlNode []來反序列化這種模式的XML

+0

'OrderResult執行(OrderRequest順序)'不返回任何東西。另外,'MyRequest'是否實現了'IMyRequest'支持的所有內容? – Matthew

+1

有沒有關於兒童的數據合同/ datamember? – Cybermaxs

+0

我有一個擴展抽象CustomerId的具體類。它被稱爲「CustomerIdByAccount」,它有一個公共屬性「AccountId」。我使用示例XML更新了問題,用於請求 – user1552485

回答

0

您是否嘗試過將您的接口裝飾爲REST風格的方法?

[ServiceContract] 
public interface IMyRequest 
{ 
    [OperationContract] 
    [WebInvoke(
     UriTemplate = "Requests/GetID", 
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Wrapped)] 
    string GetId(MyRequest myRequest); 
... 

另外:

  • 確保在[數據成員]屬性匹配您的請求負載。在XML請求負載中傳遞的所有內容都必須被服務中的序列化程序捕獲。我建議保持命名相同,但可以使用[DataMember(name =「MyProperty」)]將其映射。此外,必須映射您的[DataContract]以匹配XML負載的父節點的名稱,如[DataContract(Name =「MyRequest」)],但前提是該類的名稱與xml節點的名稱不同。這樣做,它會將您的xml反序列化到服務器端對象/ dto
  • 您聽到的錯誤聽起來像是抱怨DataContract中的複雜類型。您的複雜類型需要與MyRequest類型相同的序列化裝飾。
  • 此外,還要確保您的REST端點必然的WebHttpBinding
+0

對不起,界面不是服務的界面。對於那些我已經放置了WebInvoke註釋的人來說,我還有另外一個。這個接口只是用於客戶標識符,我們現在只使用帳戶ID來識別客戶,但將來它可能是設備序列號,地址,等等...這就是爲什麼我想使用接口而不是固定類型的數據成員,我可以繼續添加更多的類型,因爲我們成長。問題是,即使我用該接口的已知類型打開了反序列化器,仍然不知道如何反序列化它。 – user1552485

+0

不夠公平,但我仍然看到你的有效載荷與dto對象不匹配。你有一個接口作爲只顯示一個方法的成員。方法不要序列化。所以我不確定編譯器如何知道使用哪個實現作爲該實現將無法在序列化/反序列化過程中生存。 – Sinaesthetic

+0

嗯,我的意思是說有辦法,但我會問自己,如果你真的需要經歷這種痛苦或重新思考。一般來說,您不想處理通過WCF服務傳遞對象完整實現的痛苦。國際海事組織,在客戶端處理純XML,然後在服務中管理。 – Sinaesthetic