1

我目前正在使用 ServiceStack 执行以下操作以将一些 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 的空数组。

4

2 回答 2

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;
}
于 2012-08-28T12:33:07.917 回答
0

您是否只想删除冗余/重复的 XML 命名空间?

如果是这样,则应确保所有 DTO 类型共享相同的单个命名空间,Config.WsdlServiceNamespace如果要从默认命名空间更改它,则该命名空间应匹配:http://schemas.servicestack.net/types

这可以通过使用[assembly:ContractNamespace]通常在 DTO 项目的 AssemblyInfo.cs 文件中定义的属性轻松完成,这是在 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 支持 wiki 页面

于 2012-08-28T16:53:47.330 回答