2008-11-06 56 views
0

我試圖創建一個WSTransfer實現(我知道羅馬吻寫一個已經爲WCF - 但它實際上並不符合規格)創建WCF的消息與多發的命名空間

我已經結束了放棄因爲WSTransfer是鬆耦合的,所以服務聯繫人上的數據合同;所以每個創建消息看起來都像消息創建(消息請求)。

這工作正常,一切都很可愛,直到它是時候迴應一個響應。

我的問題是WSTransfer響應的構造方式。以創建爲例,響應看起來像

<wxf:ResourceCreated> 
    <wsa:Address>....</wsa:Address> 
    <wsa:ReferenceProperties> 
    <xxx:MyID>....</xxx:MyId> 
    </wsa:ReferenceProperties> 
</wxf:ResourceCreated> 

正如您所看到的,響應消息中有3個不同的XML名稱空間。

現在,當涉及一個人時很容易;你可以(即使你不暴露),創建一個數據合同,並設定值,並然而,問題的響應中的子元素設定不同的命名空間發生火災回來

Message response = Message.CreateMessage(request.Version, 
      "http://schemas.xmlsoap.org/ws/2004/09/transfer/CreateResponse", 
      resourceCreatedMessage); 

;看起來WCF的datacontracts不會這樣做。即使使用

[MessageBodyMember(Namespace="....")] 
的響應類中的各個元素

似乎沒有做任何改變,一切都變得對合同類指定的命名空間的一部分。

那麼如何將不同的名稱空間應用於WCF消息中的單個元素;要麼通過合同,要麼通過一些其他jiggery pokery?

回答

0

所以跟進jezell的答案;在手動創建消息時使用XmlSerialization的問題是,根的子元素的元素名稱會被損壞。發生這種情況的原因是,儘管在手動創建消息時使用了DataContractSerializer,但操作契約被標記爲[XmlSerializerFormat]。

您不能將XmlSerializer傳遞到Message.CreateMessage()中,因爲它需要一個XmlObjectSerializer,而XmlSerializer不是。

因此,答案似乎是爲XmlSerializer編寫一個包裝類,該類包含XmlObjectSerializer作爲其基類(here's an example)並將其傳入;以及你的留言課。

不幸的是,它不夠聰明,在XML中設置前綴;所以你最終的消息像

<ResourceCreated xmlns="http://schemas.xmlsoap.org/ws/2004/09/transfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/">http://localhost:8731/Design_Time_Addresses/AddTests/WSTransfer/</Address> 
    <ReferenceType xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/"></ReferenceType> 

但是,這一切等同。