Во-первых, если вам нужны Typed C # Services, я настоятельно рекомендую использовать более гибкую, универсальную, более чистую и быструю альтернативу в C # Add ServiceStack Reference .SOAP - это медленный, хрупкий и раздутый формат сериализации , который следует рассматривать только для устаревших интеграций.
По умолчанию ServiceStack использует .NET XML DataContract Serializer для сериализации XML или SOAP, поэтому поведение зависитв .NET XML DataContractSerializer
реализация.
Для обработки SOAP он использует общий класс Message
WCF, который по умолчанию использует DataContractSerializer
, но вы можете переключиться на заполнение WCF Message
, используя реализацию XmlSerializer, добавив Атрибут [XmlSerializerFormat] в ваших DTO для запросов и ответов.
Вы можете запросить WCF svcutil в .NET для принудительной генерации классов DataContract или XmlSerializer с помощью командной строки /serializer
переключатель, например:
svcutil endpoint.wsdl /serializer:DataContractSerializer
svcutil endpoint.wsdl /serializer:XmlSerializer
Переопределение ContentTypes
Вы можете зарегистрировать пользовательский тип содержимого для переопределения сериализации Xml, используемой для запросов XML, например, вы можете переопределить ее для использованияXmlSerializer
реализация для обработки запросов XML с чем-то вроде:
ContentTypes.Register(MimeTypes.Xml,
(req, dto, stream) => {
using (var xw = XmlWriter.Create(stream))
{
var ser = new XmlSerializerWrapper(dto.GetType());
ser.WriteObject(xw, dto);
}
},
(type, stream) => {
using (var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
{
var serializer = new System.Xml.Serialization.XmlSerializer(type);
return serializer.Deserialize(reader);
}
});
Metadata Предварительный просмотр для запросов SOAP
Поскольку вы выводите поведение из предварительного просмотра метаданных, обратите внимание, что предварительный просмотр не генерируется с использованием WCF Serializer для запросов SOAP, тело запроса генерируется с использованием DataContraceSerializer
, поэтомуне будет отражать тот же вывод при использовании реализации XmlSerializer в сообщении WCF.