2011-03-02 26 views
1

我已經在服務器上設置了一個wcf服務,該服務器將數據提供給使用Flashbuilder4構建的flex項目。我使用webservice introspection功能來生成DTO和服務代理。其中一個DTO具有Object類型的屬性。這個通用對象的內容會根據特定的條件而有所不同,但始終是另一個複雜的對象。創建並填充在FB4的VO順利,但是當對象序列化,它看起來是這樣的:用FlashBuilder4的通用數據類型向wcf服務發送請求

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<SOAP-ENV:Body> 
<tns:GetC xmlns:tns="EP2ProblemDemo1"> 
<tns:anyObj> 
<tns:Property1>yo!</tns:Property1> 
<tns:Property2>yo! yo!</tns:Property2> 
</tns:anyObj> 
</tns:GetC> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

下,您可能注意到anyObj財產丟失任何種類的類型信息,儘管引用類型ClassB的的對象:

public class ClassA 
{ 
    public string Property1; 
} 
public class ClassB : ClassA 
{ 
    public string Property2; 
} 

的anyObj論據GETC缺少類似如下:

的xsi:type = 「TNS:ClassB的」 的xmlns:TNS = 「EP2ProblemDemo1」

當wcf服務嘗試對消息進行解碼時,又會產生錯誤。我認爲該服務將anyObj的內容解釋爲不能隱式轉換爲基礎對象的數組?

將anyObj參數(類型爲Object)設置爲ClassB的實例時,似乎類型信息丟失。這是正確的行爲?我的印象是,儘管你可以設置一個超類變量來引用它的一個子類,但子類的類型信息應該被保留,因此也包含在該對象的序列化表示中。

編輯 這似乎是FlashBuilder4串行從Object類型的屬性發送回WCF服務,則無法反序列化什麼看起來像一個數組時剔除了具體類型和命名空間信息。另外,當在FB4中導入WSDL文件時,VO繼承將會丟失,因爲它們最終會擴展EventDispatcher以便進行綁定。

SOLUTION 我的解決方案是改變粘性和朝向與AMF遠程處理移動,使用FluorineFX FluorineFX official website其中精美的作品,並且具有更低的帶寬消耗的由於數據作爲字節數組傳遞到愉快的副作用在.NET實現。

我相信WebORB WebORB official site也可以用來在.net中實現AMF,但我還沒有嘗試過。

回答

0

您不能使用「任何」對象。您必須始終明確描述哪些類型是允許的。檢查KnownTypeAttributeServiceKnownTypeAttributeDataContractResolver(我還沒有太多的經驗)。如果您確實需要發送任意數據,而不能定義所有可能的對象,則使用XElement。在xsd中,它將被描述爲xsd:any。

+0

是啊!我錯過了這個問題演示,但不幸的是沒有關閉實際的項目。 – 2011-03-08 01:13:22

0
  1. 對於您在網絡上發送的所有對象類型,您需要設置所謂的[DataContract]屬性

    [DataContract] 公共類ClassA的 { 公共字符串Property1; }

  2. 代替使用基本類型(對象)應使用基類,並利用[KnownType]屬性

    [的ServiceContract(命名空間= 「EP2ProblemDemo1」)] 公共接口IService { [的OperationContract] ClassC GetC(ClassD classB); }

    [KnownType(typeof運算(ClassA的)),KnownType(typeof運算(ClassB的))] 公共類D類 {}

希望這有助於

+0

感謝您的快速回復!看起來我已經把一個相當糟糕的演示放在一起,因爲這些點是有效的,並在實際項目中實施。 – 2011-03-08 01:15:43