Utilisation d'en-têtes SOAP
La communication avec une méthode de service Web XML créée à l'aide de SOAP respecte un format standard. Une partie de ce format est constituée des données encodées dans un document XML. Le document XML consiste en une balise Envelope racine qui est elle-même constituée d'un élément Body obligatoire et d'un élément Header optionnel. L'élément Body comprend les données spécifiques au message. L'élément Header optionnel peut contenir des informations supplémentaires qui ne sont pas directement en relation avec le message particulier. Chaque élément enfant de l'élément Header est appelé un en-tête SOAP.
Bien que les en-têtes SOAP puissent contenir des données relatives au message puisque la spécification SOAP n'en définit pas strictement le contenu, ils contiennent généralement les informations traitées par l'infrastructure dans un serveur Web. Un en-tête SOAP peut par exemple être utilisé pour fournir des informations de routage du message SOAP.
Définition et traitement des en-têtes SOAP
Les services Web XML créés à l'aide d'ASP.NET peuvent définir et manipuler les en-têtes SOAP. La définition d'un en-tête SOAP nécessite de définir une classe représentant les données d'un en-tête SOAP particulier et de la dériver de la classe SoapHeader.
Pour définir une classe représentant un en-tête SOAP
Créez une classe dérivant de la classe SoapHeader avec un nom correspondant à l'élément racine de l'en-tête SOAP.
public class MyHeader : SoapHeader [Visual Basic] Public Class MyHeader : Inherits SoapHeader
Ajoutez des propriétés ou des champs publics, correspondant aux noms et à leurs types de données respectifs pour chaque élément de l'en-tête SOAP.
Supposons par exemple l'en-tête SOAP ci-après, la classe qui le suit définit une classe représentant l'en-tête SOAP.
public class MyHeader : SoapHeader { public DateTime Created; public long Expires; } [Visual Basic] 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 XML
Ajoutez un membre public à la classe implémentant le service Web XML 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; [Visual Basic] <WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService ' Add a member variable of the type deriving from SoapHeader. Public TimeStamp As MyHeader
Appliquez un attribut SoapHeader à chaque méthode de service Web XML destinée à traiter l'en-tête SOAP. Affectez à la propriété MemberName de l'attribut SoapHeader le nom de la variable de membre créée à la première étape.
[WebMethod] [SoapHeader("timeStamp")] public void MyWebMethod() [Visual Basic] <WebMethod, SoapHeader("TimeStamp")> _ Public Sub MyWebMethod()
Dans chaque méthode de service Web XML à laquelle l'attribut SoapHeader est appliqué, accédez à la variable de membre créée à la première étape pour traiter les données envoyées dans l'en-tête SOAP.
[WebMethod] [SoapHeader("timeStamp", Direction=SoapHeaderDirection.InOut)] 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"; } [Visual Basic] <WebMethod,SoapHeader("TimeStamp", _ Direction:=SoapHeaderDirection.InOut)> _ Public Function MyWebMethod() As String ' Verify that the client sent the SOAP Header. If (TimeStamp Is Nothing) Then TimeStamp = New MyHeader End If ' Set the value of the SoapHeader returned ' to the client. TimeStamp.Expires = 60000 TimeStamp.Created = DateTime.UtcNow Return "Hello World" End Function
L'exemple de code suivant montre comment définir et traiter un en-tête SOAP dans un service Web XML créé à l'aide de ASP.NET. Le service Web XML MyWebService
a une variable de membre nommée timeStamp
, qui est d'un type dérivant de SoapHeader (MyHeader
) et affectée à la propriété MemberName de l'attribut SoapHeader. De plus, un attribut SoapHeader est appliqué à la méthode de service Web XML MyWebMethod
spécifiant myHeaderMemberVariable
. Dans la méthode de service Web XML MyWebMethod
, myHeaderMemberVariable
est accessible pour définir la valeur des éléments XML Created
et Expires
de l'en-tête SOAP.
<%@ WebService Language="C#" Class="MyWebService" %>
using System;
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 : System.Web.Services.WebService
{
// Add a member variable of the type deriving from SoapHeader.
public MyHeader timeStamp;
// Apply a SoapHeader attribute.
[WebMethod]
[SoapHeader("timeStamp", Direction=SoapHeaderDirection.InOut)]
public string HelloWorld()
{
if (timeStamp == null)
timeStamp = new MyHeader();
timeStamp.Expires = 60000;
timeStamp.Created = DateTime.UtcNow;
return "Hello World";
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As Long
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
Inherits System.Web.Services.WebService
' Add a member variable of the type deriving from SoapHeader.
Public timeStamp As MyHeader
' Apply a SoapHeader attribute.
<WebMethod(), _
SoapHeader("timeStamp", Direction:=SoapHeaderDirection.InOut)> _
Public Function HelloWorld() As String
If (timeStamp Is Nothing) Then
timeStamp = New MyHeader
End If
timeStamp.Expires = 60000
timeStamp.Created = DateTime.UtcNow
Return "Hello World"
End Function
End Class
Dans l'exemple précédent, une réponse SOAP est retournée au client avec la valeur 60 000 (nombre de millisecondes, soit 1 minute) affectée à l'élément Expires
et l'heure actuelle en temps universel affectée à l'élément Created
. En d'autres termes, la réponse SOAP suivante est envoyée au client.
<?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>
Création d'un client qui traite des en-têtes SOAP
Un client de service Web XML peut envoyer et recevoir des en-têtes SOAP lorsqu'il communique avec un service Web XML. Lorsqu'une classe proxy est générée pour un service Web XML attendant ou retournant des en-têtes SOAP à l'aide de l'utilitaire Wsdl.exe, elle inclut les informations concernant les en-têtes SOAP. En fait, la classe proxy a des variables de membre représentant les en-têtes SOAP qui sont en corrélation avec celles trouvées dans le service Web XML. La classe proxy a aussi des définitions des classes correspondantes représentant l'en-tête SOAP. Par exemple, les classes proxy générées pour le service Web XML précédent auront une variable de membre de type MyHeader
et une définition pour la classe MyHeader
. Pour plus d'informations sur la création d'une classe proxy, consultez Création d'un proxy de service Web XML.
Remarque : Si le service Web XML définit les variables de membre représentant les en-têtes SOAP de type SoapHeader ou SoapUnknownHeader au lieu d'une classe dérivant de SoapHeader, une classe proxy n'aura pas d'information concernant l'en-tête SOAP.
Pour traiter des en-têtes SOAP dans un client de service Web XML
Créez une nouvelle instance de la classe représentant l'en-tête SOAP.
Dim mySoapHeader As MyHeader = New MyHeader() [C#] MyHeader mySoapHeader = new MyHeader();
Remplissez les valeurs pour l'en-tête SOAP.
header.Expires = 60000 header.Created = DateTime.UtcNow [C#] header.Expires = 60000; header.Created = DateTime.UtcNow;
Créez une nouvelle instance de la classe proxy.
Dim proxy As MyWebService = New MyWebService() [C#] MyWebService proxy = new MyWebService();
Assignez l'objet d'en-tête SOAP à la variable de membre de la classe proxy représentant l'en-tête.
proxy.MyHeaderValue = mySoapHeader [C#] proxy.MyHeaderValue = mySoapHeader
Appelez la méthode sur la classe proxy qui communique avec la méthode de service Web XML.
La partie en-tête SOAP de la demande SOAP envoyée au service Web XML inclura le contenu des données stockées dans l'objet d'en-tête SOAP.
Dim results as String = proxy.MyWebMethod() [C#] string results = proxy.MyWebMethod();
L'exemple de code suivant illustre comment passer un en-tête SOAP d'un client à un service Web XML.
<%@ Page Language="VB" %>
<asp:Label id="ReturnValue" runat="server" />
<script runat=server language=VB>
Sub Page_Load(o As Object, e As EventArgs)
Dim header As MyHeader = New MyHeader() ' Populate the values of the SOAP header. header.Expires = 60000 header.Created = DateTime.UtcNow
' Create a new instance of the proxy class.
Dim proxy As MyWebService = New MyWebService()
' Add the MyHeader SOAP header to the SOAP request. proxy.MyHeaderValue = header
' Call the method on the proxy class that communicates
' with your XML Web service method.
Dim results as String = proxy.MyWebMethod()
' Display the results of the method in a label.
ReturnValue.Text = results
End Sub
</script>
[C#]
<%@ Page Language="C#" %>
<asp:Label id="ReturnValue" runat="server" />
<script runat=server language=c#>
void Page_Load(Object o, EventArgs e)
{
MyHeader header = new MyHeader(); // Populate the values of the SOAP header. header.Expires = 60000; header.Created = DateTime.UtcNow;
// Create a new instance of the proxy class.
MyWebService proxy = new MyWebService();
// Add the MyHeader SOAP header to the SOAP request. proxy.MyHeaderValue = header;
// Call the method on the proxy class that communicates
// with your XML Web service method.
string results = proxy.MyWebMethod();
// Display the results of the method in a label.
ReturnValue.Text = results;
}
</script>
Modification des destinataires des en-têtes SOAP
Par défaut, les en-têtes SOAP sont envoyés par un client de service Web XML à une méthode de service Web XML lorsqu'un attribut SoapHeader est appliqué à la méthode. Un en-tête SOAP peut néanmoins être également renvoyé au client de service Web XML par la méthode du service. Il peut aussi être envoyé dans les deux sens. La définition de la propriété Direction d'un attribut SoapHeader appliquée à une méthode de service Web XML contrôle le destinataire de l'en-tête SOAP. La propriété Direction est de type SoapHeaderDirection, qui a quatre valeurs : In, Out, InOut et Fault. Ces valeurs se réfèrent respectivement au destinataire (qu'il s'agisse du serveur de service Web XML ou non), au client, au serveur et client de service Web XML ou au fait que l'en-tête SOAP est envoyé au client lorsqu'une exception est levée par le service Web XML.
Remarque : la version 1.0 du Kit de développement .NET Framework SDK ne prend pas en charge la valeur Fault.
Pour modifier le destinataire de l'en-tête SOAP
Définissez l'en-tête SOAP.
public class MyHeader : SoapHeader { public DateTime Created; public long Expires; } [Visual Basic] Public Class MyHeader Inherits SoapHeader Public Created As DateTime Public Expires As Long End Class
Ajoutez une variable de membre à la classe implémentant le service Web XML.
[WebService(Namespace="https://www.contoso.com")] public class MyWebService : WebService { public MyHeader myOutHeader; [Visual Basic] <WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService Inherits WebService Public myOutHeader As MyHeader
Appliquez un attribut SoapHeader à chaque méthode de service Web XML qui traite l'en-tête SOAP. Affectez chaque destinataire prévu à la propriété Direction avec l'énumération SoapHeaderDirection. L'exemple suivant définit le client de service Web XML comme destinataire en affectant SoapHeaderDirection.Out à Direction.
[WebMethod] [SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)] [Visual Basic] <WebMethod, _ SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)>
Traitez ou définissez l'en-tête SOAP, en fonction du destinataire. L'exemple de code suivant définit les valeurs de l'en-tête SOAP, puisque le destinataire est le client de service Web XML.
// Set the Time the SOAP message expires. myOutHeader.Expires = 60000; myOutHeader.Created = DateTime.UtcNow; [Visual Basic] ' Set the Time the SOAP message expires. myOutHeader.Expires = 60000 myOutHeader.Created = DateTime.UtcNow
L'exemple de code suivant définit un en-tête SOAP MyHeader
envoyé au client à partir de la méthode de service Web XML.
<%@ WebService Language="C#" Class="MyWebService" %>
using System;
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 : WebService
{
public MyHeader myOutHeader;
[WebMethod]
[SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)]
public void MyOutHeaderMethod()
{
// Set the time the SOAP message expires.
myOutHeader.Expires = 60000;
myOutHeader.Created = DateTime.UtcNow;
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As Long
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
Inherits WebService
Public myOutHeader As MyHeader
<WebMethod, _
SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)> _
Public Sub MyOutHeaderMethod()
' Set the time the SOAP message expires.
myOutHeader.Expires = 60000
myOutHeader.Created = DateTime.UtcNow
End Sub
End Class
Gestion d'en-têtes SOAP inconnus
Un client de service Web XML peut envoyer une demande SOAP avec un en-tête SOAP à une méthode de service Web XML que le service Web XML attendait sans l'avoir explicitement défini. Dans ce cas, il est important de déterminer si la sémantique de l'en-tête SOAP est comprise et traitée, puisque la spécification SOAP déclare qu'une exception est levée lorsque les en-têtes SOAP ont un attribut mustUnderstand ayant la valeur true. Pour plus d'informations sur la gestion des en-têtes SOAP requis par un client, consultez Gestion des en-têtes SOAP requis par un client de service Web XML.
Pour gérer des en-têtes SOAP inconnus à partir d'un client de service Web XML
Ajoutez une variable de membre à la classe implémentant le service Web XML avec un type de SoapUnknownHeader ou SoapHeader ou un tableau de l'un d'eux, pour gérer plusieurs en-têtes SOAP inconnus.
La déclaration du type comme un tableau ou une instance unique de SoapUnknownHeader a l'avantage supplémentaire que SoapUnknownHeader a une propriété Element. La propriété Element est de type XmlElement et représente le document XML pour l'élément Header de la demande ou la réponse SOAP. Ainsi, une méthode de service Web XML peut déterminer le nom de l'en-tête SOAP ainsi que les données passées par l'en-tête, en interrogeant la propriété Element.
public class MyWebService { public SoapUnknownHeader[] unknownHeaders; [Visual Basic] Public Class MyWebService Public unknownHeaders() As SoapUnknownHeader
Appliquez un attribut SoapHeader à chaque méthode de service Web XML destinée à traiter chaque en-tête SOAP inconnu.
[WebMethod] [SoapHeader("unknownHeaders")] public string MyWebMethod() [Visual Basic] <WebMethod, _ SoapHeader("unknownHeaders") > _ Public Function MyWebMethod() As String
Ajoutez du code pour déterminer si vous pouvez traiter les en-têtes SOAP inconnus.
Si la variable de membre est de type SoapUnknownHeader, une méthode de service Web XML peut déterminer le nom de l'en-tête SOAP ainsi que les données passées par l'en-tête, en interrogeant la propriété Element. La propriété Name de la propriété Element identifie le nom de l'en-tête SOAP.
foreach (SoapUnknownHeader header in unknownHeaders) { // Check to see if this a known header. if (header.Element.Name == "MyKnownHeader") [Visual Basic] Dim header As SoapUnknownHeader For Each header In unknownHeaders ' Check to see if this is a known header. If (header.Element.Name = "MyKnownHeader") Then
Affectez true à la propriété DidUnderstand de la variable de membre représentant l'en-tête SOAP inconnu si le traitement d'un en-tête SOAP particulier est connu.
Si une méthode de service Web XML ne traite pas un en-tête SOAP inconnu et n'affecte pas true à la propriété DidUnderstand, SoapHeaderException peut être levé. Pour plus d'informations, consultez Gestion des en-têtes SOAP requis par un client de service Web XML
// Check to see if this is a known header. if (header.Element.Name == "MyKnownHeader") header.DidUnderstand = true; else // For those headers that cannot be // processed, set DidUnderstand to false. header.DidUnderstand = false; } [Visual Basic] ' Check to see if this a known header. If (header.Element.Name = "MyKnownHeader") Then header.DidUnderstand = True Else ' For those headers that cannot be ' processed, set DidUnderstand to false. header.DidUnderstand = False End If
Remarque La propriété DidUnderstand est utilisée par les services Web XML créés à l'aide d'ASP.NET pour communiquer avec la méthode de service. Elle ne fait pas partie de la spécification SOAP. Sa valeur n'apparaît dans aucune partie de la demande ni de la réponse SOAP.
Remarque Lorsqu'un client de service Web XML crée une classe proxy avec l'outil Web Services Description Language Tool (Wsdl.exe) et qu'un service Web XML définit la variable de membre représentant un en-tête SOAP avec le type SoapUnknownHeader, aucune référence à cet en-tête n'est ajoutée à la classe proxy. Si un client de service Web XML décide d'ajouter cet en-tête à la demande SOAP, il doit modifier la classe proxy en ajoutant une variable de membre et en appliquant un attribut SoapHeader à la méthode appelant la méthode de service Web XML pertinente.
Gestion des en-têtes SOAP requis par un client de service Web XML
Un client peut exiger qu'une méthode de service Web XML interprète correctement la sémantique de l'en-tête SOAP et la traite en conséquence pour que la demande SOAP aboutisse. Pour ce faire, les clients définissent l'attribut mustUnderstand de l'en-tête SOAP à 1. Par exemple, la demande SOAP suivante demande à son destinataire de traiter l'en-tête SOAP MyCustomSoapHeader
.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/" >
<soap:Header>
<MyCustomSoapHeader soap:mustUnderstand="1" xmlns="https://www.contoso.com">
<custom>Keith</custom>
</MyCustomSoapHeader>
</soap:Header>
<soap:Body>
<MyUnknownHeaders xmlns="https://www.contoso.com" />
</soap:Body>
</soap:Envelope>
La définition ou non de l'en-tête SOAP par le service Web XML détermine la façon dont le service doit gérer les en-têtes requis par le client. ASP.NET gère une grande partie du travail dans le cas où le service Web XML définit l'en-tête SOAP. Dans la procédure qui suit, vous pouvez apprendre comment gérer les deux cas.
Pour gérer les en-têtes SOAP non définis par le service Web XML mais requis par un client de service Web XML
Procédez comme pour gérer les en-têtes SOAP inconnus à partir d'un client de service Web XML en faisant particulièrement attention à la propriété DidUnderstand de l'en-tête SOAP.
Pour les en-têtes SOAP non définis par le service Web XML, la valeur initiale de DidUnderstand est false. Si ASP.NET détecte des en-têtes SOAP ayant false affecté à leur propriété DidUnderstand après le retour de la méthode de service Web XML, SoapHeaderException est automatiquement levé.
Pour gérer les en-têtes SOAP requis par un client de service Web XML et définis par le service Web XML
Procédez comme pour traiter les en-têtes SOAP dans un service Web XML créé à l'aide d'ASP.NET dans chaque méthode de service Web XML.
Pour les en-têtes SOAP définis par le service Web XML et traités dans la méthode de service Web XML recevant l'en-tête SOAP, ASP.NET suppose que le service comprend l'en-tête et affecte true à la valeur initiale de DidUnderstand.
Le service Web XML MyWebService
suivant définit l'en-tête SOAP MyHeader
et exige qu'il soit envoyé avec les appels à la méthode de service Web XML MyWebMethod
. De plus, MyWebMethod
traite les en-têtes SOAP inconnus. Pour les en-têtes que MyWebMethod
peut traiter, true est affecté à DidUnderstand.
<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader base class.
public class MyHeader : SoapHeader {
public string MyValue;
}
public class MyWebService {
public MyHeader myHeader;
// Receive all SOAP headers other than the MyHeader SOAP header.
public SoapUnknownHeader[] unknownHeaders;
[WebMethod]
[SoapHeader("myHeader")]
//Receive any SOAP headers other than MyHeader.
[SoapHeader("unknownHeaders")]
public string MyWebMethod()
{
foreach (SoapUnknownHeader header in unknownHeaders)
{
// Perform some processing on the header.
if (header.Element.Name == "MyKnownHeader")
header.DidUnderstand = true;
else
// For those headers that cannot be
// processed, set DidUnderstand to false.
header.DidUnderstand = false;
}
return "Hello";
}
}
[Visual Basic]
<%@ 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 MyValue As String
End Class
Public Class MyWebService
Public myHeader As MyHeader
' Receive all SOAP headers other than the MyHeader SOAP header.
Public unknownHeaders() As SoapUnknownHeader
<WebMethod, _
SoapHeader("myHeader"), _
SoapHeader("unknownHeaders")> _
Public Function MyWebMethod() As String
'Receive any SOAP headers other than MyHeader.
Dim header As SoapUnknownHeader For Each header In unknownHeaders
' Perform some processing on the header.
If header.Element.Name = "MyKnownHeader" Then
header.DidUnderstand = True
' For those headers that cannot be
' processed, set DidUnderstand to false.
Else
header.DidUnderstand = False
End If
Next header
Return "Hello"
End Function
End Class
Remarque La propriété DidUnderstand est utilisée par ASP.NET pour communiquer avec la méthode de service Web XML. Elle ne fait pas partie de la spécification SOAP ; sa valeur n'apparaît dans aucune partie de la demande ni de la réponse SOAP.
Si un service Web XML transfère un en-tête SOAP, il est très important de suivre les règles de la spécification SOAP, en particulier celles relatives à la valeur de Actor. Pour plus d'informations, consultez le site Web du W3C (http://www.w3.org/TR/SOAP/).
Gestion des erreurs qui surviennent lors du traitement d'un en-tête SOAP
Lorsqu'un service Web XML détecte une erreur spécifique au traitement d'un en-tête, SoapHeaderException doit être levé. L'utilisation de cette classe d'exception permet aux services Web XML de mettre correctement la réponse en forme. Si le client est créé à l'aide du .NET Framework, il recevra SoapHeaderException, avec le contenu, y compris la propriété InnerException placée dans la propriété Message. La propriété InnerException du SoapHeaderException intercepté par le client sera null. C'est un modèle de programmation pris en charge par le .NET Framework puisque l'exception est envoyée sur le réseau dans un élément XML <Fault> SOAP comme cela est stipulé dans la spécification SOAP. Pour plus d'informations sur les exceptions, consultez Gestion et levée d'exceptions dans les services Web XML.
L'exemple de code suivant lève une exception SoapHeaderException si un client fait une demande SOAP à la méthode de service Web XML MyWebMethod
en affectant la propriété Expires
à une date et une heure passées au moment où la demande SOAP atteint le service Web XML.
<%@ 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 DateTime Expires;
public DateTime Received;
}
[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()
{
if (timeStamp == null)
timeStamp = new MyHeader();
else
{
// Check whether the SOAP message is expired.
if ((timeStamp.Expires.CompareTo(DateTime.UtcNow)) <= 0)
{
// The SOAP message is expired, so throw a SOAP header
// exception indicating that.
SoapHeaderException se = new SoapHeaderException(
"SOAP message expired before reaching this node.",
SoapException.ClientFaultCode,
this.Context.Request.Url.ToString());
throw se;
}
}
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As DateTime
Public Received As DateTime
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()
If (TimeStamp Is Nothing) Then
TimeStamp = New MyHeader
Else
' Check whether the SOAP message is expired.
If ((TimeStamp.Expires.CompareTo(DateTime.UtcNow)) <= 0) Then
' The SOAP message is expired, so throw a SOAP header
' exception indicating that.
Dim se As New SoapHeaderException( _
"SOAP message expired before reaching this node.", _
SoapException.ClientFaultCode, _
Me.Context.Request.Url.ToString())
Throw se
End If
End If
End Sub
End Class
Remarque : Le .NET Framework version 1.0 inclut la propriété SoapHeaderAttribute.Required qui permet à un service Web XML de demander qu'un client envoie un en-tête SOAP spécifique lorsqu'elle est définie à true. ASP.NET indique que l'en-tête SOAP est requis dans un document WSDL généré en définissant l'attribut wsdl:required à « true » dans l'élément soap:header. Les clients .NET Framework du service Web XML construit à partir du document WSDL reçoivent un SoapHeaderException s'ils n'envoient pas l'en-tête SOAP requis, et les autres clients reçoivent une erreur SOAP. Pour interagir avec d'autres implémentations SOAP, cette fonctionnalité est supprimée dans les versions ultérieures.
La propriété Required est obsolète à la version 1.1 et l'attribut wsdl:required d'un élément soap:header dans un document WSDL n'est pas pris en compte par l'outil du langage WSDL (Wsdl.exe). Comme un en-tête SOAP ne peut plus être exigé, un service Web XML doit vérifier que le champ ou la propriété représentant l'en-tête SOAP n'est pas null avant d'y accéder.
Voir aussi
SoapHeader | SoapHeaderAttribute | SoapHeaderException | SoapUnknownHeader | Création de services Web XML à l'aide d'ASP.NET | Création de clients de service Web XML