Служба ServiceStack не может вернуть динамический c объект ответа, как Json и XML - PullRequest
1 голос
/ 16 апреля 2020

Я создал сервис, который объединяет и возвращает набор динамических c json данных из внешнего сервиса. Возвращать данные как json нормально - но XML ...

Я пытался вернуть их как необработанные XML в строковом свойстве DTO (используя JsonConvert.DeserializeXNode), но затем символы xml в строке экранируются, в последнем ответе ServiceStack.

Я попытался вернуть данные как динамический / объект, и снова json нормально, но XML выдает много ошибок времени выполнения DataContractSerializer.

Это, якобы простая вещь, сводит меня с толку. Может ли кто-нибудь опубликовать пример, когда данные Dynami c возвращаются как json и xml, одним и тем же сервисом / операцией (в зависимости от заголовка Accept)?

Спасибо, ребята.

1 Ответ

1 голос
/ 16 апреля 2020

ServiceStack использует . NET XML DataContractSerializer для сериализации ваших DTO по умолчанию. Если это не подходит, вы можете зарегистрировать свой собственный XML сериализатор типа контента для принятия XML сериализации, которая включает в себя пример для замены используемого DataSontractSerializer ServiceStack по умолчанию. * XXSerializer NET .

Я пытался вернуть его как необработанный XML в строковом свойстве DTO (используя JsonConvert.DeserializeXNode), но затем символы xml в строке экранируются, в окончательный ответ ServiceStack.

Это неверно, ServiceStack позволяет возвращать ряд необработанных типов данных , таких как необработанные XML string, которые записываются непосредственно в ответ OutputStream, возможно, что-то еще ускользает от него после его записи в ответ (например, веб-сервер или клиент), но это не ServiceStack.

Альтернативная стратегия управления XML Сериализация - копировать их в DTO, снабженные атрибутами DataContract или XmlSerializer, которые позволят вам контролировать сериализацию XML, однако это было бы утомительно для динамических данных c, из которых XML, как правило, является плохим выбором в качестве сериализации. NET обобщенные c коллекции данных производят уродливые XML.

Спецификации типа содержимого c Реализации

Если вам нужно только обработать t он XML для этой одной службы, вместо переопределения реализации XML Serializer по умолчанию, вы можете использовать спецификацию типа содержимого c реализаций 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;
    }
}
...