Как определить и обработать заголовки SOAP

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

Пример кода

Веб-службы, созданные с помощью ASP.NET, могут определять заголовки SOAP и манипулировать ими. Для определения заголовка SOAP определяется класс, представляющий данные в конкретном заголовке SOAP, и этот класс делается производным класса SoapHeader.

Определение класса, представляющего заголовок SOAP

  1. Создайте класс, являющийся производным класса SoapHeader, с именем, соответствующим корневому элементу для заголовка SOAP.

    public class MyHeader : SoapHeader
    
    Public Class MyHeader : Inherits SoapHeader
    
  2. Добавьте открытые поля или свойства, соответствующие именам и связанным с ними типам данных, для каждого элемента в заголовке SOAP.

    Например, для представленного ниже заголовка SOAP следующий за ним класс определяет класс, представляющий заголовок SOAP.

    <soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <MyHeader xmlns="http://www.contoso.com">
        <Created>dateTime</Expires>
        <Expires>long</Expires>
      </MyHeader>
    </soap:Header>
    
    public class MyHeader : SoapHeader 
    {
       public DateTime Created;
       public long Expires;
    }
    
    Public Class MyHeader : Inherits SoapHeader 
       Public Created As DateTime
       Public Expires As Long
    End Class
    

Обработка заголовков SOAP в веб-службе

  1. Добавьте открытый член в класс, реализующий веб-службу и представляющий заголовок SOAP.

    [WebService(Namespace="http://www.contoso.com")]
    public class MyWebService 
    {
        // Add a member variable of the type deriving from SoapHeader.
        public MyHeader timeStamp;
    
    <WebService(Namespace:="http://www.contoso.com")> _
    Public Class MyWebService
        ' Add a member variable of the type deriving from SoapHeader.
        Public TimeStamp As MyHeader
    
  2. Примените атрибут SoapHeader для каждого метода веб-службы, который должен обрабатывать заголовок SOAP. Задайте для свойства MemberName атрибута SoapHeader имя созданной на первом шаге переменной члена.

        [WebMethod]
        [SoapHeader("timeStamp")]
        public void MyWebMethod()
    
        <WebMethod, SoapHeader("TimeStamp")> _ 
        Public Sub MyWebMethod()
    
  3. В каждом методе веб-службы, для которого применен атрибут SoapHeader, обратитесь к созданной на первом шаге переменной члена для обработки данных, отправленных в заголовок SOAP.

        [WebMethod]
        [SoapHeader("myHeaderMemberVariable")]
        public string MyWebMethod() 
        {
            // Verify that the client sent the SOAP Header.
            if (timeStamp == null) timeStamp = new MyHeader();
            // Set the value of the SoapHeader returned to the client.
            timeStamp.Expires = 60000;
            timeStamp.Created = DateTime.UtcNow;
    
            return("Hello World!");
        }
    
        <WebMethod,SoapHeader("TimeStamp", _
                              Direction:=SoapHeaderDirection.InOut)> _ 
        Public Function MyWebMethod() As String
            ' Process the SoapHeader.
            If (TimeStamp Is Nothing) Then
                TimeStamp = New MyHeader
            End If
            TimeStamp.Expires = 60000
            TimeStamp.Created = DateTime.UtcNow
    
            Return "Hello World!"
        End Function
    

Пример

В следующем примере кода показано, как определить и обработать заголовок SOAP в веб-службе, созданной с помощью ASP.NET. Веб-служба MyWebService содержит переменную-член с именем myHeaderMemberVariable, которая имеет тип, производный от SoapHeader (MyHeader). Значением переменной является свойство MemberName атрибута SoapHeader. Кроме того, атрибут SoapHeader применяется для метода веб-службы MyWebMethod с указанием переменной myHeaderMemberVariable. В методе веб-службы MyWebMethod осуществляется обращение к переменной myHeaderMemberVariable для получения значения элемента XML Username заголовка SOAP.

<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;

// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader 
{
   public DateTime Created;
   public long Expires;
}

[WebService(Namespace="http://www.contoso.com")]
public class MyWebService 
{
    // Add a member variable of the type deriving from SoapHeader.
    public MyHeader myHeaderMemberVariable;
 
    // Apply a SoapHeader attribute.
    [WebMethod]
    [SoapHeader("myHeaderMemberVariable")]
    public void MyWebMethod() 
    {
        // Process the SoapHeader.
        if (myHeaderMemberVariable.Username == "admin")
        {
           // Do something interesting.
        }
    }
}
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols

' Define a SOAP header by deriving from the SoapHeader base class.
Public Class MyHeader : Inherits SoapHeader 
    Public Username As String
    Public Password As String
End Class

<WebService(Namespace:="http://www.contoso.com")> _
Public Class MyWebService 
    ' Add a member variable of the type deriving from SoapHeader.
    Public myHeaderMemberVariable As MyHeader
 
    ' Apply a SoapHeader attribute.
    <WebMethod, SoapHeader("myHeaderMemberVariable")> _
    Public Sub MyWebMethod()
        ' Process the SoapHeader.
        If (myHeaderMemberVariable.Username = "admin") Then
           ' Do something interesting.
        End If
    End Sub
End Class

Если в предыдущем примере запрос SOAP, направляемый в метод MyWebMethod, имеет заголовок SOAP MyHeader, элементу UserName которого присвоено значение Admin, выполняется дополнительный код. То есть следующий запрос SOAP приводит к выполнению этого кода.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <MyHeader xmlns="http://www.contoso.com">
      <Created>dateTime</Created>
      <Expires>long</Expires>
    </MyHeader>
  </soap:Header>
  <soap:Body>
    <MyWebMethod xmlns="http://www.contoso.com" />
  </soap:Body>
</soap:Envelope>

См. также

Справочник

SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException

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

Создание клиентов XML-веб-службы

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

Использование заголовков SOAP
XML-веб-службы с использованием ASP.NET