Редактиране на SOAP съобщения със SOAP разширения Microsoft Docs
Този раздел е за наследени технологии. XML уеб услугите и клиентите на XML уеб услугите трябва да бъдат изградени с помощта на Windows Communication Foundation.
SOAP разширенията позволяват на разработчиците да разширят функционалността на дадена уеб услуга чрез модифициране на SOAP съобщенията, получени и изпратени от уеб услугата или нейния клиент. Например, можете да приложите алгоритъм за криптиране или компресиране, който работи на съществуваща уеб услуга.
Преди да научите как работят SOAP разширенията, добра идея е да се запознаете с концепцията за продължителността на живота на уеб услугата. За повече информация вижте XML Web Service Lifetime Schema.
Следващата фигура показва основните стъпки на повикване от клиент към уеб услуга.
Както можете да видите от диаграмата, .NET Framework сериализира и десериализира XML на двата етапа на обработка, както на машината на уеб услугата, така и на клиентската машина на уеб услугата. SOAP разширение може да бъде добавено към тази инфраструктура за валидиране или модифициране на SOAP съобщения преди и след всяка от тези стъпки за сериализация и десериализация. Например разширение за SOAP криптиране може да криптира XML частта на SOAP съобщение, след като .NET Framework сериализира клиентските аргументи и след това да дешифрира SOAP съобщението на уеб сървъра, преди .NET Framework да десериализира SOAP съобщението. Тези етапи (на които SOAP разширението може да валидира или модифицира SOAP съобщение) се дефинират от изброяването SoapMessageStage. В този случай SOAP разширението извършва криптиране във фазатаAfterSerialize и декриптиране във фазатаBeforeDeserialize.
По принцип, ако SOAP разширение промени съдържанието на SOAP съобщение, промените трябва да се направят както вклиент, както и на сървъра. Тоест, ако SOAP разширение работи на клиента и криптира SOAP съобщение, съответното SOAP разширение трябва да дешифрира съобщението на сървъра. Ако SOAP съобщението не е декриптирано, рамката на ASP.NET не може да десериализира SOAP съобщението в обект.
Разбира се, ако SOAP разширението не променя SOAP съобщенията (например, ако регистрира само такива съобщения), то може да работи само на клиента или сървъра. В този случай получателят получава същото SOAP съобщение, както ако SOAP разширението не работи и ASP.NET инфраструктурата може да дешифрира съобщението. Освен това, ако модифицирането на SOAP съобщения от SOAP разширение не им попречи да бъдат десериализирани, не е необходимо да стартирате SOAP разширението от двете страни (клиент и сървър).
Разширяване на класа SOAPExtension
За да приложите SOAP разширение, създайте клас, който наследява класа SoapExtension. КласътSOAPExtension има три метода, които трябва (или трябва) да бъдат внедрени:
GetInitializer е абстрактен метод с два подписа
За начин за прилагане на тези методи вижте ръководството за модифициране на SOAP съобщение със SOAP разширения.
МетодътChainStream получава обектStream и връща обектStream. Тъй като SOAP разширението се изпълнява на всекиSoapMessageStage и променя SOAP съобщението, то трябва да прочете данни от обектаStream, предадени на методаChainStream, и да ги запише в обектаStream, върнат от методаChainStream. Следователно е важно в методаChainStream и двете препратки къмStream да бъдат присвоени на променливи-членове.
Класът, наследен отSoapExtension използва методиGetInitializer иInitialize за инициализиране на вътрешни данни въз основа на уеб услугата, към която са приложени, или нейния метод. Например SOAP разширение, което регистрира SOAP съобщения, изпратени и получени от метод на уеб услуга, може да инициализира име на файл за съхраняване на информация за регистрационни файлове (на базата на името на уеб услугата или нейния метод, срещу който работи SOAP разширението).
В кой момент рамката на уеб услугите извиква методаGetInitializer и какви параметри се предават на този метод зависи от конфигурацията на SOAP разширението, както следва:
Ако SOAP разширението е конфигурирано с атрибут, рамката на уеб услугата извиква методаGetInitializer, когато методът на уеб услугата (method ) е достъпен за първи път.
Ако SOAP разширението е конфигурирано с конфигурационен файл, инфраструктурата на уеб услугите извиква методаGetInitializer само когато цялата уеб услуга е достъпна за първи път.
Инфраструктурата на уеб услугите кешира обекта, върнат от методаGetInitializer. След това рамката предава обекта на инициализатор към методаInitialize всеки път, когато се изпълнява SOAP разширение с тази уеб услуга или нейния метод.
Действителната разширена обработка (която не е обхваната от стандартната SOAP обработка) се извършва от метода ProcessMessage. Всеки път, когато рамката на уеб услугите извиква методаProcessMessage, тя предава (като аргумент) екземпляр на произхождащ от SoapMessage клас, който съдържа информация за SOAP съобщението на този конкретен етап. Ако SOAP разширението работи с уеб услуга, се предава обект SoapServerMessage. Ако се изпълнява с клиент на уеб услуга, се предава обект SoapClientMessage.
Разширения и изключения за сапун
Самите сапунени екстеншъниникога не трябва да прави изключения. Те обаче могат да добавят информация за изключението към свойството Exception на SoapMessage, предадено на метода ProcessMessage.
Те могат също така да действат като манипулатор на изключения за цялото приложение, като използват същите възможности за улавяне на всички изключения в приложение, което има инсталирано SOAP разширение, и изпълняват някои задачи, включително модифициране на върнатата SOAP грешка.
Ред на извикване на SOAP методи за разширение
Предишната част на тази статия показа кои методи заменя разширението SOAP. Сега нека разгледаме реда, в който инфраструктурата на уеб услугите извиква SOAP методи за разширение, както се нарича методът на уеб услугата. Следващата последователност предполага, че SOAP разширението работи както на клиента, така и на сървъра. Действията, които изискват SOAP разширението да се изпълнява както на клиента, така и на сървъра, се игнорират от .NET Framework, освен ако това условие не е изпълнено.
Съобщението за заявка се подготвя от страна на клиента
Клиентът извиква метода на прокси класа.
На клиента се създава нов екземпляр на SOAP разширението.
Ако това SOAP разширение се изпълнява с тази уеб услуга на клиента за първи път, се извиква методът GetInitializer на SOAP разширението.
Методът ProcessMessage се извиква със SoapMessageStage, зададен наBeforeSerialize.
ASP.NET на клиентския компютър сериализира аргументите на метода на уеб услугата в XML.
Извиква се методътProcessMessage сSoapMessageStage, зададен наAfterSerialize.
ASP.NET на клиентския компютър изпраща SOAP съобщение по мрежата до уеб сървъра, хостващ уеб услугата.
Страната на сървъра получава съобщението за заявка и се подготвяотговор
ASP.NET на уеб сървъра получава SOAP съобщението.
На уеб сървъра се създава нов екземпляр на SOAP разширението.
Когато това SOAP разширение се изпълнява с тази уеб услуга на клиента за първи път от страната на сървъра, методътGetInitializer на SOAP разширението, работещо на сървъра, се извиква на уеб сървъра.
Извиква се методътInitialize.
Извиква се методътChainStream.
Извиква се методътProcessMessage сSoapMessageStage, зададен наBeforeDeserialize.
ASP.NET десериализира аргументите в XML.
Извиква се методътProcessMessage сSoapMessageStage, зададен наAfterDeserialize.
ASP.NET създава нов екземпляр на класа, който имплементира уеб услугата и извиква метода на уеб услугата, като предава десериализираните аргументи. Този обект се намира на същия компютър като уеб сървъра.
Метод на уеб услуга изпълнява своя код и в крайна сметка задава върнатата стойност и изходните параметри.
Извиква се методътProcessMessage сSoapMessageStage, зададен наBeforeSerialize.
ASP.NET на уеб сървъра сериализира върнатата стойност и изходните параметри в XML.
Извиква се методътProcessMessage сSoapMessageStage, зададен наAfterSerialize.
ASP.NET изпраща SOAP отговор по мрежата обратно към клиента на уеб услугата.
Страната на клиента получава съобщение за отговор
ASP.NET на клиентската машина получава SOAP съобщението.
Извиква се методътProcessMessage сSoapMessageStage, зададен наBeforeDeserialize.
ASP.NET десериализира XML в върната стойност и изходни параметри.
Методът се наричаProcessMessage, сSoapMessageStage, зададен наAfterDeserialize.
ASP.NET предава върнатата стойност и изходните параметри на екземпляр на прокси класа.
Клиентът получава върнатата стойност и изходните параметри.
Внедряване на SOAP разширение
Има два начина за стартиране на SOAP разширение на клиентско или сървърно приложение. Първият е да настроите приложението да изпълнява разширението. За да конфигурирате SOAP разширението да работи с всички уеб методи на всички уеб услуги, особено vroot, променете секцията Element на файла Web.config. Следният код показва, че стойността на атрибутаtype трябва да бъде на един ред и да съдържа пълното име на разширението, неговата версия, култура и токена на публичния ключ на подписаното сглобяване.
Вторият начин е да създадете персонализиран атрибут, който се прилага към метода на уеб услугата. За да създадете персонализиран атрибут, създайте клас, който наследява от SoapExtensionAttribute. За подробности относно създаването на персонализиран атрибут вижте Как да: внедрите SOAP разширение. За повече информация относно създаването на персонализирани атрибути вижте Създаване на персонализирани атрибути.
Внедряването на SOAP разширение трябва да е наясно с възможността за атака за отказ на услуга, ако разширението използва XmlTextReader за четене на потока от данни. Един от начините за предотвратяване на такава атака е да се гарантира, че свойството ProhibitDtd е зададено наtrue. |
Приоритети и приоритетни групи
Използвайки атрибути или конфигурационен файл, можете да зададете приоритети на SOAP разширенията, което ще помогне да се определи относителният ред на изпълнениемножество SOAP разширения, конфигурирани да работят с метод на XML уеб услуга. Колкото по-висок е приоритетът на SOAP разширението, толкова по-скоро ще бъде изпълнено (спрямо SOAP съобщението, което в момента се изпраща или получава по мрежата). SOAP разширенията могат да принадлежат към всяка от трите приоритетни групи. Във всяка група свойствотоpriority дефинира приоритетите на отделните елементи. Колкото по-ниска е стойността на свойствотоpriority, толкова по-висок е неговият относителен приоритет (0 е най-високият приоритет).
SOAP разширенията са разделени на следните три групи въз основа на техния относителен приоритет: тези, конфигурирани с атрибут, тези, дефинирани в конфигурационния файл с параметъраgroup, зададен на0, и стойността1 за тази настройка. Техният ред на приоритет е както следва:
Група с най-висок приоритет: SOAP разширения, конфигурирани с конфигурационен файл, за койтоgroup е зададено на0.
Група със среден приоритет: SOAP разширения, конфигурирани с атрибута.
Група с най-нисък приоритет: SOAP разширения, конфигурирани с конфигурационен файл, за койтогрупа е зададена на1.