Атрибут xsi:type
обычно не требуется, поскольку схема XSD, содержащаяся в разделе types
WSDL, является достаточной информацией для клиента / сервера, чтобы выяснить тип всех элементов.
Но учтите, что иногда необходимо иметь поле или элемент любого типа (xsd:anyType
), чтобы вы могли использовать полиморфизм (как вы упомянули сами).
Например, у вас может быть веб-служба, которая выполняет некоторые команды, отправленные ему в поле XML, помеченном как xsd:anyType
. Такой сервис ничего не указывает о типе данных во время разработки, поэтому вместо этого информация о типе должна предоставляться во время выполнения.
Конечно, такой сервис не принимает абсолютно никаких типов, но работает с набором предопределенных типов (т. Е. Вы не отправляете ему просто какую-то ерунду; только допустимые команды из набора типов команд).
Но часть XML - это просто связь. В конечном итоге вам придется что-то делать с этим типом программно, в коде клиент / сервер. Это означает преобразование xsd:anyType
в объект на языке программирования.
Инструмент WSDL-To-Code обычно отображает xsd:anyType
в верхний класс Object
, что, честно говоря, не очень полезно. По этой причине xsd:anyType
всегда сериализуется вместе с xsi:type
, который указывает фактический тип, так что ваш код знает, какого черта там находится.
Относительно того, насколько оно корректно, отправьте xsi:type
в формате doc / literal. Мой ответ: я думаю, что оно действительно. Спецификации WSDL и SOAP не упоминают ничего конкретного, связанного с этим (чтобы запретить это), а спецификация WS-Interoperability это позволяет.
Так что я думаю xsi:type
это не что-то положительное или отрицательное, а просто инструмент для работы.