Comment : définir et traiter des en-têtes SOAP

Cette rubrique est spécifique à une technologie existante. Les services Web XML et les clients du service Web XML doivent à présent être créés à l'aide de Windows Communication Foundation.

Exemple de code

Les services Web créés à l'aide d'ASP.NET peuvent définir et manipuler des en-têtes SOAP. Pour définir un en-tête SOAP, il faut définir une classe représentant les données dans un en-tête SOAP particulier et le dériver de la classe SoapHeader.

Pour définir une classe représentant un en-tête SOAP

  1. Créez une classe qui dérive de la classe SoapHeader avec un nom correspondant à l'élément racine pour l'en-tête SOAP.

    public class MyHeader : SoapHeader
    
    Public Class MyHeader : Inherits SoapHeader
    
  2. Ajoutez des propriétés ou des champs publics en faisant correspondre les noms et leurs types de données respectifs pour chaque élément dans l'en-tête SOAP.

    Par exemple, pour l'en-tête SOAP suivant, la classe qui le suit définit une classe représentant l'en-tête SOAP.

    <soap:Header xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
      <MyHeader xmlns="https://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
    

Pour traiter des en-têtes SOAP dans un service Web

  1. Ajoutez un membre public à la classe qui implémente le service Web du type représentant l'en-tête SOAP.

    [WebService(Namespace="https://www.contoso.com")]
    public class MyWebService 
    {
        // Add a member variable of the type deriving from SoapHeader.
        public MyHeader timeStamp;
    
    <WebService(Namespace:="https://www.contoso.com")> _
    Public Class MyWebService
        ' Add a member variable of the type deriving from SoapHeader.
        Public TimeStamp As MyHeader
    
  2. Appliquez un attribut SoapHeader à chaque méthode de service Web qui projette de traiter l'en-tête SOAP. Affectez à la propriété MemberName de l'attribut SoapHeader le nom de la variable membre créée à la première étape.

        [WebMethod]
        [SoapHeader("timeStamp")]
        public void MyWebMethod()
    
        <WebMethod, SoapHeader("TimeStamp")> _ 
        Public Sub MyWebMethod()
    
  3. Dans chaque méthode de service Web à laquelle l'attribut SoapHeader est appliqué, accédez à la variable membre créée à la première étape pour traiter les données envoyées dans l'en-tête 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
    

Exemple

L'exemple de code suivant montre comment définir et traiter un en-tête SOAP dans un service Web créé à l'aide d'ASP.NET. Le service Web MyWebService a une variable membre nommée myHeaderMemberVariable, qui est d'un type dérivant de SoapHeader (MyHeader) et défini sur la propriété MemberName de l'attribut SoapHeader. De plus, un attribut SoapHeader est appliqué à la méthode de service Web MyWebMethod qui spécifie myHeaderMemberVariable. Dans la méthode de service Web MyWebMethod, l'accès à myHeaderMemberVariable permet d'obtenir la valeur de l'élément XML Username de l'en-tête 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="https://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:="https://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

Dans l'exemple précédent, si la demande SOAP envers MyWebMethod a un en-tête SOAP MyHeader avec un élément UserName défini sur Admin, du code supplémentaire est exécuté. Autrement dit, la demande SOAP suivante provoque l'exécution de ce code.

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

Voir aussi

Référence

SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException

Concepts

Création de clients de service Web XML

Autres ressources

Utilisation d'en-têtes SOAP
Services Web XML utilisant ASP.NET