2016-03-01 55 views
2

我们的一个要求是有一个解耦架构,我们需要将数据从一个系统映射到另一个系统,而中间映射由ServiceStack服务请求处理。我们的问题是,供应商只能提供通过XML不符合该ServiceStack提供像下面的标准字典请求数据:ServiceStack解析XML请求到字典

<Lead xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <d2p1:KeyValueOfstringstring> 
     <d2p1:Key>String</d2p1:Key> 
     <d2p1:Value>String</d2p1:Value> 
    </d2p1:KeyValueOfstringstring> 
    </Lead> 

相反,他们需要像一个机制:

<Lead> 
    <LeadId>Value</LeadId> 
    <FirstName>First Name</FirstName> 
    <LastName>Last Name</LastName> 
    ... 
</Lead> 

由于他们的xml请求中的节点可能会随时间而改变,而我们只是充当中间人,是否有一种本地方式来接受动态请求或将其作为具有类似于下面的数据的字典来处理?

Dictionary<string, string> 
{ 
    { "LeadId", "Value" }, 
    { "FirstName", "First Name" }, 
    { "LastName", "Last Name" } 
    ... 
}; 
+0

是的。你能提供一个带有几个条目的XML文件吗?我不是100%确定具有多个条目的输入的外观。 – jdweng

回答

2

默认XML序列化不提供任何方式,你可以透明地推断出一个XML片段到一个字符串字典,以便你将需要手动分析,你可以告诉ServiceStack to skip built-in Serialization在ServieStack做XML通过实施IRequiresRequestStream这ServiceStack将与请求流注入,所以你可以自己反序列化,如:

public class Lead : IRequiresRequestStream 
{ 
    public Stream RequestStream { get; set; } 
} 

在服务你,然后手工解析原始的XML并将其转换成你想要的,如数据收集:

public class RawServices : Service 
{ 
    public object Any(Lead request) 
    { 
     var xml = request.RequestStream.ReadFully().FromUtf8Bytes(); 

     var map = new Dictionary<string, string>(); 
     var rootEl = (XElement)XDocument.Parse(xml).FirstNode; 

     foreach (var node in rootEl.Nodes()) 
     { 
      var el = node as XElement; 
      if (el == null) continue; 
      map[el.Name.LocalName] = el.Value; 
     } 

     return new LeadResponse { 
      Results = map 
     } 
    } 
} 
+1

昨天晚上我使用了一个非常类似的方法,晚上使用RequestStream。很高兴知道我正在使用一种好方法。非常感谢你! – DevTech