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