【问题标题】:ServiceStack service unable to return dynamic response object, both as Json and XMLServiceStack 服务无法以 Json 和 XML 形式返回动态响应对象
【发布时间】:2020-07-30 00:46:17
【问题描述】:

我已经构建了一个服务,它结合并返回来自外部服务的一组动态 json 数据。以 json 格式返回数据很好 - 但 XML...

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

我尝试将数据作为动态/对象返回,json 也很好,但 XML 会引发很多 DataContractSerializer 运行时错误。

这件事,据说很简单,却把我逼到了墙角。任何人都可以发布一个示例,其中动态数据可以通过相同的服务/操作(取决于 Accept-header)以 json 和 xml 的形式返回?

谢谢各位。

【问题讨论】:

    标签: xml dynamic servicestack


    【解决方案1】:

    ServiceStack 默认使用.NET's XML DataContractSerializer 序列化您的DTO。如果这不合适,您可以register your own XML Content Type Serializer 接管 XML 序列化,其中包括replace ServiceStack's default DataContractSerializer to use .NET's XmlSerializer 的示例。

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

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

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

    内容类型特定实现

    如果您只需要处理这一服务的 XML,您可以使用 ServiceStack 的 Content-Type Specific Implementations 以不同方式处理 XML 请求,而不是覆盖默认的 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      相关资源
      最近更新 更多