Ответ 1
Чтобы позвонить в веб-сервис, вам необходимо соблюдать его контракт. Если веб-служба имеет <operationA>
и <operationB>
, но вы отправите ей <operationC>
, вы получите сообщение об ошибке (ошибка в языке SOAP).
Веб-служба имеет операции <operationA>
и <operationB>
и знает, что делать с сообщением, когда сообщение содержит <operationA>
или <operationB>
. Но он не имеет <operationC>
и не знает, что делать с сообщением, содержащим <operationC>
, поэтому он просто возвращает ошибку. Неправильное тело нельзя игнорировать, но заголовки, с другой стороны, не имеют ограничений на то, что они есть, поэтому вам нужен другой механизм, чтобы правильно их обрабатывать.
Заголовки используются для расширения сообщения путем добавления поддержки транзакций, аутентификации, маршрутизации и т.д. и т.д. Но эти расширения не определены в спецификации SOAP, они определены пользователем. В спецификации просто сказано, что для этого используются заголовки, а также указывает, как сообщение должно обрабатываться при наличии заголовков. Атрибут mustUnderstand
является частью "способа обработки сообщения".
Сообщение SOAP отправляется от отправителя до конечного пункта назначения, возможно, путем прохождения через посредство SOAP-посредников вдоль пути сообщения. Заголовок может быть нацелен на конкретный node или на последний node (т.е. Атрибут SOAP 1.1 actor
или SOAP 1.2 role
), а когда это произойдет, node должен что-то сделать с заголовком. Это может быть либо использование, либо игнорирование.
Атрибут mustUnderstand
указывает, является ли обработка заголовка необязательной или обязательной. В основном это означает, что node пытается найти соответствующий обработчик, соответствующий заголовку, и приступить к обработке сообщения в соответствии с его спецификацией. Если он не может найти соответствующий обработчик, он должен вернуть ошибку и прекратить дальнейшую обработку. Если mustUnderstand
истинно /1, node не может игнорировать его.
Например, представьте, что заголовок предназначен для семантики транзакции (т.е. вызов должен выполняться в транзакции, так что операции выполняются атомарным способом, либо все последующие, либо все сбои). Если обработка node видит заголовок транзакции, она должна начать эту транзакцию. Представьте, что произойдет, если node увидит заголовок, но не знает, что это такое, поэтому он решает просто игнорировать его и никакая транзакция не запускается. Позже некоторые операции терпят неудачу, а другие преуспевают, и транзакция отката не выполняется. Итак, теперь ваше приложение находится в противоречивом состоянии.
Атрибут SOAP mustUnderstand позволяет обеспечить надежную эволюцию. Элементы, отмеченные атрибутом SOAP mustUnderstand со значением "1", ДОЛЖНЫ считаться каким-то образом модифицировать семантику своих родительских или одноранговых элементов. Элементы меток таким образом гарантируют, что это изменение в семантике не будет молча (и, предположительно, ошибочно) игнорироваться теми, кто не может полностью понять это.