2012-08-28 30 views
1

我目前在做與ServiceStack以下張貼一些XML回服務器:發送在服務棧的XML陣列

<Server xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <UserName>Bob</UserName> 
    <UserGroups xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <d3p1:string>History</d3p1:string> 
     <d3p1:string>Geography</d3p1:string> 
    </UserGroups> 
</Server> 

上述工作,但是我怎麼做到這一點的:

<Server xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <UserName>Bob</UserName> 
    <UserGroups> 
     <UserGroup>History</UserGroup> 
     <UserGroup>Geography</UserGroup> 
    </UserGroups> 
</Server> 

我曾嘗試:

[CollectionDataContract(ItemName = "UserGroup")] 
public partial class ArrayOfStringUserGroup : List<string> 
{ 
    public ArrayOfStringUserGroup() 
    { 
    } 

    public ArrayOfStringUserGroup(IEnumerable<string> collection) : base(collection) { } 
    public ArrayOfStringUserGroup(params string[] args) : base(args) { } 
} 

和我在後DTO有以下幾點:

[DataMember(Name = "UserGroups", Order = 3)] 
    public ArrayOfStringUserGroup UserGroups { get; set; } 

但我得到UserGroups作爲UserGroupDto的空數組。

回答

1

這給出了你想要的。

Server s = new Server(); 
s.UserName = "Bob"; 
s.UserGroups = new List<string>(); 
s.UserGroups.Add("History"); 
s.UserGroups.Add("Geography"); 


StringWriter stream = new StringWriter(); 
XmlWriter writer = 
      XmlTextWriter.Create(
       stream, 
       new XmlWriterSettings() { OmitXmlDeclaration = true,Indent = true } 
      ); 

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("i", "http://www.w3.org/2001/XMLSchema-instance"); 

XmlSerializer xml = new XmlSerializer(typeof(Server)); 
xml.Serialize(writer,s,ns); 

var xmlString = stream.ToString(); 

public class Server 
{ 
    public string UserName; 
    [XmlArrayItem("UserGroup")] 
    public List<string> UserGroups; 
} 
+0

謝謝您的回覆。但是,我不清楚這是如何與服務棧協同工作的?我也會發送json,不知道以上是否會起作用。 –

0

你只是想刪除多餘/重複XML命名空間?

如果是這樣,你應該確保所有的DTO類型共享相同的單個命名空間,它應該匹配Config.WsdlServiceNamespace,如果你想從默認命名空間:http://schemas.servicestack.net/types改變它。

這可以很容易地通過使用通常在DTO項目的AssemblyInfo.cs文件中定義的[assembly:ContractNamespace]屬性來完成,這裏是如何在ServiceStack.Examples項目完成:

[assembly: ContractNamespace("http://schemas.servicestack.net/types", 
      ClrNamespace = "ServiceStack.Examples.ServiceModel.Operations")] 
[assembly: ContractNamespace("http://schemas.servicestack.net/types", 
      ClrNamespace = "ServiceStack.Examples.ServiceModel.Types")] 

從ServiceStack的SOAP Support wiki page服用。

+0

嗨,我試過以上,但沒有工作。除了我發佈的ArrayOfStringUserGroup代碼之外,我還要這樣做嗎?兩種組合都不起作用。此外,這是一個基於REST的服務,在POST的主體中,我希望發送沒有等的XML塊。 –

+0

不幸的是,仍然沒有運氣,不知道爲什麼這不起作用?它的任何例子工作? –