ServiceStack 服务无法 return 动态响应对象,两者都是 Json 和 XML

ServiceStack service unable to return dynamic response object, both as Json and XML

我构建了一个服务,它结合了 returns 来自外部服务的一组动态 json 数据。将数据返回为 json 没问题 - 但 XML...

我尝试在 DTO 的字符串-属性 中将其作为原始 XML 返回(使用 JsonConvert.DeserializeXNode),但是 xml-字符在字符串在最终的 ServiceStack 响应中被转义。

我试过将数据作为 dynamic/object 返回,json 也很好,但是 XML 抛出了很多 DataContractSerializer 运行时错误。

这件看似简单的事情却让我难以自拔。任何人都可以 post 一个示例,其中动态数据可以通过相同的 service/operation(取决于 Accept-header)作为 json 和 xml 返回?

谢谢大家。

ServiceStack 使用 .NET's XML DataContractSerializer to serialize your DTOs by default. If that's unsuitable you can register your own XML Content Type Serializer to take over XML Serialization which includes an example to replace ServiceStack's default DataContractSerializer to use .NET's XmlSerializer

I've tried returning it as raw XML in a string-property of the DTO (using JsonConvert.DeserializeXNode), but then the xml-characters in the string gets escaped, in the final ServiceStack response.

这是不正确的,ServiceStack 让你 return a number of raw data types 像一个原始的 XML string 它直接写入响应 OutputStream,可能有其他东西逃避它在将其写入响应(例如 Web 服务器或客户端)之后,但它不是 ServiceStack。

另一种控制 XML 序列化的策略是将它们复制到用 DataContractXmlSerializer 属性注释的 DTO 中,这将允许您控制 XML 的方式然而,序列化对于动态数据来说会很乏味,其中 XML 通常是一个糟糕的选择,因为序列化 .NET 的通用数据集合会产生难看的 XML.

内容类型特定实现

如果您只需要为这个服务处理 XML,而不是覆盖默认的 XML 序列化程序实现,您可以使用 ServiceStack 的 Content-Type Specific Implementations 来处理 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;
    }
}