我构建了一个服务,它组合并返回来自外部服务的一组动态json数据。以json形式返回数据是可以的,但是XML。。。
我曾尝试在DTO的字符串属性中(使用JsonConvert.DescializeXNode(将其作为原始XML返回,但在最终的ServiceStack响应中,字符串中的XML字符被转义。
我已经尝试过将数据作为动态/对象返回,json也是可以的,但XML抛出了很多DataContractSerializer运行时错误。
这本应该很简单的事情,却把我逼上了墙。有人能举一个例子吗?在这个例子中,动态数据可以通过相同的服务/操作以json和xml的形式返回(取决于Accept头(?
谢谢,伙计们。
ServiceStack使用。NET的XMLDataContractSerializer来序列化您的DTO。如果不合适,您可以注册自己的XML内容类型序列化程序来接管XML序列化,其中包括一个替换ServiceStack的默认DataContractSerializer的示例。NET的XmlSerializer。
我曾尝试在DTO的字符串属性中(使用JsonConvert.DescializeXNode(将其作为原始XML返回,但在最终的ServiceStack响应中,字符串中的XML字符被转义。
这是不正确的,ServiceStack允许您返回许多原始数据类型,如直接写入响应OutputStream
的原始XMLstring
,在将其写入响应后可能会有其他内容对其进行转义(例如Web服务器或客户端(,但它不是ServiceStack。
控制XML序列化的另一种策略是将它们复制到用DataContract
或XmlSerializer
属性注释的DTO中,这将允许您控制XML的序列化方式,但对于动态数据来说,这将是乏味的,其中XML作为序列化通常是一个糟糕的选择。NET的通用数据集合生成了难看的XML。
特定于内容类型的实现
如果您只需要处理这一服务的XML,而不是覆盖默认的XML序列化程序实现,您可以使用ServiceStack的内容类型特定实现以不同的方式处理XML请求,例如:
public class MyServices : Service
{
// Handles all other unspecified Verbs/Formats
public object Any(MyRequest request) => ...;
// Handles any XML Requests
public object AnyXml(MyRequest request)
{
var dto = Any(request);
string xml = CustomXmlSerializer(dto);
return xml;
}
}