Практическое руководство. Изменение сообщения SOAP с помощью расширений SOAP

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Расширения SOAP могут вставляться в конвейер обработки сообщений SOAP платформы .NET Framework для изменения или проверки сообщения запроса или ответа SOAP во время его сериализации или десериализации в веб-службе или клиенте. В данном пошаговом руководстве показывается, как создать и выполнить расширение SOAP. Описание работы расширений SOAP, а также порядка вызова методов расширений SOAP в конвейере обработки сообщений см. в разделе Изменение сообщений SOAP с помощью расширений SOAP.

В данном пошаговом руководстве описываются следующие процедуры.

  • Наследование класса от класса SoapExtension.

  • Сохранение ссылок на объекты Stream, представляющие будущие сообщения SOAP до и после того, как расширение SOAP выполнило свою обработку.

  • Инициализация данных, связанных с расширением SOAP.

  • Обработка сообщений SOAP на соответствующей стадии SoapMessageStage или стадиях.

Настройка расширения SOAP для выполнения с конкретными методами веб-службы.

Предварительные требования

Унаследуйте класс от класса SoapExtension.

Класс, унаследованный от класса SoapExtension, — это класс, выполняющий функции расширения SOAP. То есть если расширением SOAP является расширение SOAP для шифрования, класс, унаследованный от класса SoapExtension, выполняет шифрование и соответствующую расшифровку.

Сохранение ссылок на объекты потока, представляющие будущие сообщения SOAP

Чтобы изменить сообщение SOAP, необходимо получить ссылку на поток, который может использоваться для получения содержимого будущих сообщений SOAP. Получить эту ссылку можно только переопределив метод ChainStream.

Сохранение ссылок на объекты потока, представляющие будущие сообщения SOAP

  1. Переопределите метод ChainStream.

    Метод ChainStream имеет следующую сигнатуру:

    public virtual Stream ChainStream(Stream stream)
    
    Public Overridable Function ChainStream(ByVal stream As Stream) As Stream
    
  2. В реализации ChainStream назначьте экземпляр Stream, передаваемый в качестве параметра.

    Ссылка на экземпляр Stream передается в метод ChainStream один раз до любой стадии SoapMessageStage. Этот экземпляр Stream ссылается на данные XML сообщения SOAP после того, как расширения SOAP более низкого приоритета (подробные сведения о приоритетах расширений SOAP см. в разделе "Настройка расширения SOAP для выполнения с методами веб-службы") произвели и внесли свои изменения в сообщение SOAP. Расширение SOAP должно назначить эту ссылку переменной члена для доступа позже на стадии SoapMessageStage, когда расширение SOAP проверяет или изменяет сообщение SOAP.

    Однако экземпляр Stream, передаваемый в метод ChainStream, не является экземпляром Stream, который должен быть изменен расширением SOAP.

  3. В реализации ChainStream создайте новый экземпляр Stream, сохраните ссылку на него в закрытой переменной члена и верните эту ссылку.

    В следующем примере показана общая реализация метода ChainStream.

Пример общей реализации метода ChainStream см. в разделе Как реализовать метод ChainStream для сохранения ссылок в объекты потоков.

Инициализация данных расширения SOAP

Класс, наследуемый от класса SoapExtension, имеет два метода инициализации данных — GetInitializer и Initialize.

Время вызова метода GetInitializer инфраструктурой ASP.NET и параметры, передаваемые в этот метод, зависят от конфигурации расширения SOAP. (См. разделы "Изменение сообщений SOAP с помощью расширений SOAP" и "Настройка расширения SOAP для выполнения с методами веб-службы".)

Инициализация данных, когда расширение SOAP настроено с помощью атрибута

  1. Реализуйте метод GetInitializer, используя следующую сигнатуру:

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    
    Public Overloads Overrides Function GetInitializer(methodInfo As _
       LogicalMethodInfo, attribute As SoapExtensionAttribute) As Object
    

    LogicalMethodInfo предоставляет подробные сведения прототипа о методе веб-службы, например число параметров и их типы данных.

  2. При необходимости вызовите метод Initialize, передав объект, возвращенный методом GetInitializer. Для многих реализаций SoapExtension метод Initialize можно оставить пустым.

Инициализация данных, когда расширение SOAP настроено в файле конфигурации

  1. Реализуйте метод GetInitializer с помощью следующей сигнатуры:

    public override object GetInitializer(Type WebServiceType)
    
    Public Overloads Overrides Function GetInitializer(WebServiceType As Type) As Object
    

    Параметр Type представляет тип класса, реализующего веб-службу.

  2. При необходимости вызовите метод Initialize, передав объект, возвращенный методом GetInitializer. Для многих реализаций SoapExtension метод Initialize можно оставить пустым.

Пример инициализации кэшированных данных при настроенном расширении SOAP см. в разделе Как инициализировать кэшированные данные при настроенном расширении SOAP.

Обработка сообщений SOAP

В классе, унаследованном от класса SoapExtension, базовым компонентом реализации является метод ProcessMessage. Этот метод несколько раз вызывается ASP.NET на каждой стадии, определенной в перечислении SoapMessageStage.

Обработка сообщений SOAP

  • Реализуйте абстрактный метод ProcessMessage.

    В следующей реализации метода ProcessMessage выполняется трассировка вызова веб-службы. Если в ходе этой трассировки стадия SoapMessageStage указывает, что параметры сериализованы в XML, производится запись XML в файл.

    public override void ProcessMessage(SoapMessage message) 
    {
       switch (message.Stage) 
       {
       case SoapMessageStage.BeforeSerialize:
           break;
       case SoapMessageStage.AfterSerialize:
           // Write the SOAP message out to a file.
           WriteOutput( message );
           break;
       case SoapMessageStage.BeforeDeserialize:
           // Write the SOAP message out to a file.
           WriteInput( message );
           break;
       case SoapMessageStage.AfterDeserialize:
           break;
       default:
           throw new Exception("invalid stage");
       }
    }
    
    Public Overrides Sub ProcessMessage(message As SoapMessage)
        Select Case message.Stage
          Case SoapMessageStage.BeforeSerialize
          Case SoapMessageStage.AfterSerialize
            ' Write the SOAP message out to a file.
            WriteOutput(message)
          Case SoapMessageStage.BeforeDeserialize
            ' Write the SOAP messae out to a file.
            WriteInput(message)
          Case SoapMessageStage.AfterDeserialize
          Case Else
            Throw New Exception("invalid stage")
        End Select
    End Sub
    

Настройка расширения SOAP для выполнения с методами веб-службы

Расширение SOAP можно настроить для выполнения с помощью атрибута или посредством изменения файла конфигурации. Настраиваемый атрибут применяется для метода веб-службы. При использовании файла конфигурации расширение SOAP выполняется со всеми веб-службами в области файла конфигурации. Подробные сведения о работе файлов конфигурации см. в разделе Configuring Applications.

Настройка расширения SOAP с помощью настраиваемого атрибута

  1. Унаследуйте класс от класса SoapExtensionAttribute.

  2. Реализуйте два свойства атрибута SoapExtensionAttribute: ExtensionType и Priority. Расширение SOAP должно вернуть свой тип в свойстве ExtensionType. Свойство Priority представляет относительный приоритет расширения SOAP, как указано в разделе "Применение группы приоритетов при изменении сообщений SOAP с помощью расширений SOAP".

  3. Примените настраиваемый атрибут для каждого метода веб-службы, с которым требуется выполнять расширение SOAP.

Настройка расширения SOAP в файле конфигурации

  1. Если элемент XML soapExtensionTypes уже отсутствует, добавьте его в раздел webServices соответствующего файла App.config или Web.config.

  2. В пределах элемента XML soapExtensionTypes добавьте элемент XML add для каждого расширения SOAP, которое требуется выполнять с каждой веб-службой в области файла конфигурации.

    Элемент XML add имеет следующие свойства.

    • type: задает тип расширения SOAP и сборку, в которой оно находится.

    • priority: задает относительный приоритет расширения SOAP внутри его группы.

    • Group: задает группу расширения SOAP, членом которой оно является.

См. также

Задачи

Как реализовать расширение SOAP
Как инициализировать кэшированные данные при настроенном расширении SOAP
Как реализовать метод ChainStream для сохранения ссылок в объекты потоков

Справочник

SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo

Основные понятия

Изменение сообщений SOAP с помощью расширений SOAP
Схема времени существования XML-веб-службы
Создание клиентов XML-веб-службы

Другие ресурсы

Configuring Applications