ServiceStack 将 xml 请求解析为字典

本文关键字:字典 请求 xml ServiceStack | 更新日期: 2023-09-27 18:37:06

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

  <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" }
    ...
};

ServiceStack 将 xml 请求解析为字典

默认的 XML 序列化不提供

任何可以透明地将 XML 片段推断为字符串字典的方法,因此您需要手动解析 XML,您可以在 ServieStack 中执行此操作,方法是告诉 ServiceStack 跳过内置序列化,方法是实现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
         }
    }
}