2012-06-15 170 views
2

我目前正在實施一個API使用ServiceStack,我遇到了一個問題。我給出的API規範定義了將發送到API的XML數據包。此規格無法更改,且不受我自己的控制。不顯示名稱與CollectionDataContract屬性

的問題是,在根元素,有像這樣的項目清單:

<data> 
    <id>0</id> 
    <locationID>10</locationID> 
    <cust> 
     <id>0</id> 
    </cust> 
    <cust> 
     <id>0</id> 
    </cust> 
    <cust> 
     <id>0</id> 
    </cust> 
    <cust> 
     <id>0</id> 
    </cust> 
</data> 

我已經實現了規範,有它幾乎是正確的,但我無法弄清楚如何有元素在XML中重複,沒有周圍的父節點。

由於這是使用ServiceStack,我正在使用Data Contracts,並嘗試將元素設置爲CollectionDataContract,但是它包裝父節點中的元素。

我想知道是否可以指定不使用父元素,或者是否可以在包含沒有父節點的節點的節點中實現普通列表。

任何想法?

+0

可惜,這似乎並不可能。問題是ServiceStack使用的序列化程序使用DataContracts,並且我找不到用另一個序列化程序代替它的方法,很可能是因爲我們不能使用多種格式。我將其作爲一個完全相同的副本來處理,因爲其他問題已經被問到過。 –

+0

可能重複的[DataContract/DataMember多元素在xml](http://stackoverflow.com/questions/4565481/datacontract-datamember-multiple-elements-in-xml) –

回答

1

這不適用於ServiceStack中使用的.NET的DataContract Xml序列化程序。如果發現不支持此一個XmlSerializer,你可以註冊到改用有: http://www.servicestack.net/ServiceStack.Northwind/vcard-format.htm

個人在這種情況下,我將只返回一個序列化:

appHost.ContentTypeFilters.Register(ContentType.Xml, SerializeToStream, DeserializeFromStream); 

或註冊一個自定義的contentType中看到xml字符串。你可以做到這一點無論:

  • 在服務的正文只返回一個字符串(你可以用它在HttpResult也迫使特定的ContentType)。在您的服務中返回XML字符串將始終爲所有端點返回XML。

  • 通過在ServiceBase中重寫OnAfterExecute並將強類型響應DTO轉換爲XML ContentType請求的XML字符串。

  • 註冊一個custom response filter(或Filter Attribute

e.g:

appHost.ResponseFilters.Add((req, res, dto) => 
{ 
    if (req.ResponseContentType == ContentType.Xml) 
    { 
     var sb = new StringBuilder(); 
     DataDto dataDto = (DataDto)dto; 
     sb.AppendLine("<data>"); 
     sb.AppendFormat("<id>{0}</id>",dataDto.Id); 
     //... etc 
     res.ContentType = ContentType.Xml; 
     using (var sw = new StreamWriter(res.OutputStream)) { 
      sw.WriteLine(sb.ToString()); 
     } 
     res.Close(); 
    } 
}); 
+0

謝謝,我真的結束了推回傢伙誰寫了規範(即將使用Web服務)並強制他們將節點包裝在父節點中。使事情變得更容易。 –