В Candidate Recommendation спецификации SOAP 1.2 (часть 1, раздел 2.4) устранены недомолвки и четко определена семантика обработки обяза­тельных заголовков:

Прел полагается, что обязательные блоки SCAP-;sat с.':звкуй влияют на семантику остальных блоков SUAР-хи'о.'нжкоп или SO.AP-.j/ieметоп Body. Поэтому узел [обязательно] обрабатывает каждый адресованный ему обязательный блок или отказывается от обработки всего SOAP-cnofnucin»i. генерируя ошибку (см. разде­лы 2.6 «Processing SOAP Messages» и 5.4 «SOAP Fault»).

Внутренняя инфраструктура Web-сервисов ASP.NET предоставляет мо­дель для операций над заголовками SOAP-сообщений. Увы, она допуска­ет обработку сообщения, даже если в нем содержится обязательный заго­ловок, который не поддерживается или не распознается целевым методом. И хотя ошибка все же генерируется, но лишь после того, как будет выпол­нен код Web-сервиса.

Обязательные заголовки в ASP.NET

Когда диспетчер сообщений (message dispatcher) Web-сервисов ASP.NET разбирает сообщение, он использует содержимое элемента Body в качестве входных параметров для вызова метода. Перед вызовом содержимое эле­мента Header (при его наличии) может быть дееериализонако в поля или свойства целевого объекта. В ходе работы метод может просматривать эти поля или свойства, определяя заголовки сообщения. Сопоставление заго­ловков полям или свойствам не обязательно и контролируется значением атрибута System.Web.Services. Protocols. Soap HeaderAttribute (рис. 2).

Рис. 2, Сопоставление заголовков полям или свойствам


Метод Ваг помечен атрибутом [SoapHeader], который ссылается на поле с именем foo. Механизм отражения (reflection) позволяет диспетчеру сооб­щений определить, что foo — это экземпляр Foo подкласса System,Web, Services, Protoco Is.Soap Header. Диспетчер знает, что все типы, производные от SoapHeader, представляют XML-элементы, которые могут располагать­ся в заголовке сообщения