2012-08-28 6 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.

Это можно легко сделать с помощью атрибута [assembly:ContractNamespace] обычно, определенный в файле AssemblyInfo.cs проекта DTO, вот как это делается в проекте 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

К сожалению, до сих пор не повезло, не уверен, почему это не работает? Любые примеры его работы? –

Смежные вопросы