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

これは、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 サポート wiki ページから取得。

于 2012-08-28T16:53:47.330 に答える