Modification du message SOAP à l'aide des extensions SOAP
Les extensions SOAP permettent aux développeurs d'améliorer la fonctionnalité d'un service Web XML en modifiant les messages SOAP envoyés à destination ou en provenance du service ou d'un client du service. Vous pouvez par exemple implémenter un algorithme de cryptage ou de compression à exécuter avec un service Web XML existant.
Pour comprendre comment une extension SOAP fonctionne, il est utile de d'abord comprendre la durée de vie d'un service Web XML. Pour une vue d'ensemble de la durée de vie d'un service Web XML, consultez Anatomie de la durée de vie d'un service Web XML. Cependant, le graphique suivant décrit les principales phases d'un appel d'un client à un service Web XML.
Anatomie de la durée de vie d'un service Web XML
Comme vous pouvez le voir, ASP.NET sérialise et désérialise le XML lors de phases, sur l'ordinateur du service Web XML et l'ordinateur de son client. Une extension SOAP peut être injectée dans l'infrastructure afin d'inspecter ou de modifier les messages SOAP avant et après chacune de ces phases de sérialisation et de désérialisation. Par exemple, une extension SOAP de cryptage peut crypter la partie XML du message SOAP, ASP.NET sérialise ensuite les arguments du client puis décrypte le message SOAP sur le serveur Web avant qu'ASP.NET ne désérialise le message SOAP. Ces phases, où une extension SOAP peut inspecter ou modifier le message SOAP, sont définies dans l'énumération SoapMessageStage. Dans ce cas, l'extension SOAP crypte au stade AfterSerialize et décrypte au stade BeforeDeserialize.
Généralement, lorsqu'une extension SOAP modifie le contenu d'un message SOAP, les modifications doivent être effectuées sur le client et sur le serveur. C'est-à-dire que si une extension SOAP s'exécute sur le client et crypte le message SOAP, une extension SOAP correspondante doit décrypter le message SOAP sur le serveur. Si le message SOAP n'est pas crypté, l'infrastructure ASP.NET ne peut alors pas désérialiser le message SOAP dans un objet. Évidemment, une extension SOAP qui ne modifie pas le message SOAP (qui consigne simplement les messages par exemple) peut s'exécuter uniquement sur le client ou sur le serveur. Dans ce cas, le destinataire reçoit le message SOAP qu'il aurait reçu si une extension SOAP n'était pas en cours d'exécution et l'infrastructure ASP.NET peut désérialiser le message SOAP. De même, si une extension SOAP ne modifie pas le SOAP d'une manière qui rend la désérialisation impossible, l'extension SOAP n'a pas besoin de s'exécuter à la fois sur le client et sur le serveur.
Maintenant que vous savez ce qu'une extension SOAP peut faire et quand elle peut accomplir sa fonctionnalité, étudions comment la créer. Les étapes fondamentales de la création d'une extension SOAP et de son exécution avec un service Web XML sont les suivantes :
- Dérivez une classe de SoapExtension.
- Enregistrez une référence dans le Stream représentant les futurs messages SOAP.
- Initialisez les données spécifiques à l'extension SOAP.
- Traitez les messages SOAP pendant le SoapMessageStage ou les stades pertinents.
- Configurez l'extension SOAP à exécuter avec les méthodes de service Web XML spécifiques.
Dérivation d'une classe à partir de SoapExtension
La classe dérivant de SoapExtension est la classe qui effectue la fonctionnalité de l'extension SOAP. C'est-à-dire que si l'extension SOAP est une extension de cryptage, la classe dérivant de la classeSoapExtension effectue le cryptage et le décryptage correspondant.
Enregistrement d'une référence dans le flux représentant les futurs messages SOAP
Pour modifier un message SOAP, vous devez substituer la méthode ChainStream, puisque c'est la seule chance de recevoir une référence au flux qui peut être utilisé pour obtenir le contenu des futurs messages SOAP.
Une référence à Stream est passée dans ChainStream une fois, avant SoapMessageStage. Ce Stream se réfère au XML du message SOAP après que les extensions SOAP de priorité inférieure (consultez Configuration de l'extension SOAP à exécuter avec les méthodes de service Web XML pour plus d'informations) ont exécuté et apporté leurs modifications au message SOAP. Une extension SOAP doit donc enregistrer cette référence dans une variable de membre pour un accès ultérieur lors de SoapMessageStage lorsqu'une extension SOAP inspecte ou modifie le message SOAP.
Le Stream passé dans ChainStream n'est cependant pas le Stream qu'une extension SOAP doit modifier. Une extension SOAP doit créer une nouvelle instance de Stream, l'enregistrer dans une variable de membre privé et la retourner dans la méthode ChainStream. Étant donné que l'extension SOAP s'exécute pendant chaque SoapMessageStage et modifie le message SOAP, une extension SOAP doit lire dans le Stream passé dans ChainStream et écrire dans la valeur de retour Stream pour ChainStream. Il est donc important d'enregistrer les deux références Stream dans la méthode ChainStream.
L'exemple suivant illustre une implémentation courante de la méthode ChainStream.
' Save the Stream representing the SOAP request or SOAP response
' into a local memory buffer.
Public Overrides Function ChainStream(stream As Stream) As Stream
' Save the passed in Stream in a member variable.
oldStream = stream
' Create a new instance of a Stream and save that in a member
' variable.
newStream = New MemoryStream()
Return newStream
End Function
[C#]
// Save the Stream representing the SOAP request or SOAP response into
// a local memory buffer.
public override Stream ChainStream( Stream stream ){
// Save the passed in Stream in a member variable.
oldStream = stream;
// Create a new instance of a Stream and save that in a member
// variable.
newStream = new MemoryStream();
return newStream;
}
Initialisation des données spécifiques à l'extension SOAP
Une extension SOAP peut initialiser des données internes, en fonction du service Web XML ou de la méthode du service auxquels elle s'applique. Par exemple, une extension SOAP qui consigne le message SOAP envoyé à destination ou en provenance d'une méthode de service Web XML peut initialiser le nom d'un fichier pour enregistrer les informations dans un journal (en fonction du nom du service Web XML ou de la méthode du service avec lesquels l'extension SOAP s'exécute).
La classe dérivant de SoapExtension a deux méthodes d'initialisation des données : GetInitializer et Initialize. GetInitializer est appelé uniquement lors du premier accès à un service Web XML ou à une méthode du service avec lesquels l'extension SOAP est configurée pour s'exécuter, en fonction de la configuration de l'extension SOAP (consultez Configuration de l'extension SOAP à exécuter avec les méthodes de service Web XML). Si l'extension SOAP est configurée avec un attribut, GetInitializer est appelé par l'infrastructure ASP.NET pour chaque méthode de service Web XML. Si elle configurée dans un fichier de configuration, GetInitializer est appelé par l'infrastructure ASP.NET uniquement lors du premier accès au service Web XML. Les données retournées de GetInitializer par une extension SOAP sont mises en cache par l'infrastructure ASP.NET pour une utilisation ultérieure par les extensions SOAP. Les données mises en cache sont passées aux extensions SOAP chaque fois que l'extension SOAP s'exécute avec ce service Web XML ou sa méthode dans la méthode Initialize.
Les informations mises à disposition d'une extension SOAP dans la méthode GetInitializer dépendent de la configuration de l'extension SOAP. Si l'extension SOAP est configurée à l'aide d'un attribut, l'attribut, ainsi que les propriétés personnalisées qui y sont associées, et LogicalMethodInfo sont passés dans GetInitializer par l'infrastructure ASP.NET. LogicalMethodInfo fournit des détails de prototype sur la méthode de service Web XML, comme le nombre de paramètres et leurs types de données. Si l'extension SOAP est configurée à l'aide d'un fichier de configuration, seul le Type de la classe implémentant le service Web XML est passé à GetInitializer.
L'exemple de code suivant initialise la donnée mise en cache dans la méthode GetInitializer de manière différente, en fonction de la configuration finale de l'extension SOAP. Si l'extension SOAP est configurée à l'aide d'un attribut, TraceExtensionAttribute
dans le cas présent, le nom du fichier spécifié dans l'attribut est mis en cache. Si l'extension SOAP est configurée à l'aide d'un fichier de configuration, le nom du fichier mis en cache est calculé, en fonction du type de service Web XML.
' When the SOAP extension is accessed for the first time, the XML
' Web service method it is applied to is accessed to store the file
' name passed in, using the corresponding SoapExtensionAttribute.
Public Overloads Overrides Function GetInitializer(methodInfo As _
LogicalMethodInfo, attribute As SoapExtensionAttribute) As Object
Return CType(attribute, TraceExtensionAttribute).Filename
End Function
' The extension was configured to run using a configuration file
' instead of an attribute applied to a specific XML Web service method.
' Return a file name, based on the class implementing the XML Web
' service's type.
Public Overloads Overrides Function GetInitializer(WebServiceType As _
Type) As Object
' Return a file name to log the trace information, based on the type.
Return "C:\" + WebServiceType.FullName + ".log"
End Function
[C#]
// When the SOAP extension is accessed for the first time, the XML
// Web service method it is applied to is accessed to store the file
// name passed in, using the corresponding SoapExtensionAttribute.
public override object GetInitializer(LogicalMethodInfo methodInfo,
SoapExtensionAttribute attribute)
{
return ((TraceExtensionAttribute) attribute).Filename;
}
// The extension was configured to run using a configuration file instead of
// an attribute applied to a specific XML Web service method.
public override object GetInitializer(Type WebServiceType)
{
// Return a file name to log the trace information, based on the type.
return "C:\\" + WebServiceType.FullName + ".log";}
Traitement des messages SOAP
Dans la classe dérivée de SoapExtension, le cœur de l'implémentation est la méthodeSoapExtension.ProcessMessage. Cette méthode est appelée plusieurs fois par ASP.NET, à chacune des étapes définies dans l'énumération SoapMessageStage. Chaque fois que la méthodeSoapExtension.ProcessMessage est appelée, SoapMessage ou une classe en dérivant est passé avec les informations concernant le message SOAP à ce stade particulier. Si l'extension SOAP est exécutée avec un service Web XML, SoapServerMessage est passé. Si elle est exécutée avec un client de service Web XML, SoapClientMessage est passé.
L'exemple de code suivant est la méthode ProcessStage d'une extension SOAP qui assure le suivi d'un appel à un service Web XML. Pendant le traçage, si SoapMessageStage est le stade où les paramètres ont été sérialisés en XML, le XML est écrit dans un fichier.
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");
}
}
[Visual Basic]
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
Ordre dans lequel les extensions SOAP sont appelées
Maintenant que vous avez étudié les méthodes qu'une extension SOAP doit substituer, examinons le moment où ASP.NET appelle les méthodes d'extension SOAP lors de l'appel d'une méthode de service Web XML. Les étapes suivantes supposent que l'extension SOAP s'exécute à la fois sur le client et sur le serveur. Si ce n'est pas le cas, les étapes associées à l'extension SOAP s'exécutant sur chacun sont ignorées par ASP.NET.
Côté client
- Un client appelle une méthode sur la classe proxy.
- Une nouvelle instance de l'extension SOAP est créée sur le client.
- Si c'est la première fois que cette extension SOAP est exécutée avec ce service Web XML sur le client, la méthode GetInitializer est alors appelée sur l'extension SOAP en cours d'exécution sur le client.
- La méthode Initialize est appelée.
- La méthode ChainStream est appelée.
- La méthode ProcessMessage est appelée avec BeforeSerialize affecté àSoapMessageStage.
- ASP.NET sur l'ordinateur client sérialise les arguments de la méthode de service Web XML en XML.
- La méthode ProcessMessage est appelée avec AfterSerialize affecté à SoapMessageStage.
- ASP.NET sur l'ordinateur client envoie le message SOAP sur le réseau, vers le serveur Web hébergeant le service Web XML.
Côté serveur
- ASP.NET sur le serveur Web reçoit le message SOAP.
- Une nouvelle instance de l'extension SOAP est créée sur le serveur Web.
- Sur le serveur Web, si c'est la première fois que cette extension SOAP est exécutée avec ce service Web XML côté serveur, la méthode GetInitializer est appelée sur l'extension SOAP en cours d'exécution sur le serveur.
- La méthode Initialize est appelée.
- La méthode ChainStream est appelée.
- La méthode ProcessMessage est appelée avec BeforeDeserialize affecté à SoapMessageStage.
- ASP.NET désérialise les arguments dans le XML.
- La méthode ProcessMessage est appelée avec AfterDeserialize affecté à SoapMessageStage.
- ASP.NET crée une nouvelle instance de la classe implémentant le service Web XML et appelle la méthode du service, en passant les arguments désérialisés. Cet objet réside sur le même ordinateur que le serveur Web.
- La méthode du service Web XML exécute son code, pour enfin définir la valeur de retour et les éventuels paramètres out.
- La méthode ProcessMessage est appelée avec BeforeSerialize affecté à SoapMessageStage.
- ASP.NET sur le serveur Web sérialise la valeur de retour et les paramètres out en XML.
- La méthode ProcessMessage est appelée avec AfterSerialize affecté à SoapMessageStage.
- ASP.NET renvoie le message de réponse SOAP sur le réseau, vers le client de service Web XML.
Côté client
- ASP.NET sur l'ordinateur client reçoit le message SOAP.
- La méthode ProcessMessage est appelée avec BeforeDeserialize affecté à SoapMessageStage.
- ASP.NET désérialise le XML dans la valeur de retour et les éventuels paramètres out.
- La méthode ProcessMessage est appelée avec AfterDeserialize affecté à SoapMessageStage.
- ASP.NET passe la valeur de retour et les éventuels paramètres out à l'instance de la classe proxy.
- Le client reçoit la valeur de retour et les éventuels paramètres out.
Configuration de l'extension SOAP à exécuter avec les méthodes de service Web XML
Une extension SOAP peut être configurée pour s'exécuter à l'aide d'un attribut personnalisé ou en modifiant un fichier de configuration. Pour utiliser un attribut personnalisé, appliquez-le à chaque méthode de service Web XML avec laquelle vous souhaitez que l'extension SOAP s'exécute. Lorsqu'un fichier de configuration est utilisé, l'extension SOAP s'exécute avec tous les services Web XML dans la portée du fichier de configuration. Pour plus d'informations sur le fonctionnement des fichiers de configuration, consultez Configuration d'applications.
Pour utiliser un attribut personnalisé, dérivez une classe de SoapExtensionAttribute. SoapExtensionAttribute a deux propriétés : ExtensionType et Priority. Une extension SOAP doit retourner le type de l'extension SOAP de la propriété ExtensionType. La propriété Priority représente la priorité relative de l'extension SOAP, brièvement abordée.
Pour spécifier qu'une extension SOAP s'exécute avec tous les services Web XML dans la portée d'un fichier de configuration, ajoutez des entrées au fichier App.config ou Web.config approprié. Plus particulièrement, un élément XML soapExtensionTypes doit être ajouté à la section webServices du fichier de configuration. Dans l'élément XML soapExtensionTypes, ajoutez des éléments XML pour chaque extension SOAP que vous souhaitez exécuter avec chaque service Web XML dans la portée du fichier de configuration. L'élément XML add a les propriétés suivantes :
Propriété | Description |
---|---|
type | Type de l'extension SOAP et assembly dans lequel elle réside. |
priority | Priorité relative de l'extension SOAP dans son groupe. |
group | Groupe dont une extension SOAP est membre. Reportez-vous aux informations détaillées sur la priorité à la suite de ce tableau. |
Une priorité est assignée aux extensions SOAP ; elle impose l'ordre d'exécution relatif de plusieurs extensions SOAP configurées pour s'exécuter avec une méthode de service Web XML. Plus la priorité d'une extension SOAP est élevée, plus son exécution est proche par rapport au message SOAP envoyé ou reçu sur le réseau. Les extensions SOAP sont dans l'un des trois groupes de priorité. Dans chaque groupe, la propriété priority distingue chaque membre. Plus la propriété priority est basse, plus la priorité relative est haute (0 étant le maximum).
Les trois groupes de priorité relative pour les extensions SOAP sont : extensions SOAP configurées à l'aide d'un attribut et extensions SOAP spécifiées dans le fichier de configuration avec un paramètre group de 0 et 1. Les extensions SOAP configurées à l'aide d'un attribut sont membres du groupe intermédiaire. Les extensions SOAP configurées à l'aide d'un fichier de configuration avec un paramètre group de 0 ont la priorité relative la plus haute. Ceux avec un paramètre group de 1 ont la priorité relative la plus basse.
L'exemple de code suivant est un fichier de configuration qui spécifie que l'extension SOAP Logger.LoggerExtension
s'exécute dans le groupe de priorité relative 0
et a une priorité de 1
.
<configuration>
<system.web>
<webServices>
<soapExtensionTypes> <add type="Logger.LoggerExtension,logger" priority="1" group="0" /> </soapExtensionTypes>
</webServices>
</system.web>
</configuration>
L'exemple de code suivant est une extension SOAP qui consigne les messages SOAP envoyés à destination et en provenance d'un service Web XML ou d'un client du service. Si l'extension SOAP suivante est installée pour être exécutée avec un service Web XML, le compte d'utilisateur ASPNET doit avoir l'autorisation d'écrire dans le répertoire dans lequel le fichier journal est écrit.
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.IO
' Define a SOAP Extension that traces the SOAP request and SOAP response
' for the XML Web service method the SOAP extension is applied to.
Public Class TraceExtension
Inherits SoapExtension
Private oldStream As Stream
Private newStream As Stream
Private m_filename As String
' Save the Stream representing the SOAP request or SOAP response into
' a local memory buffer.
Public Overrides Function ChainStream(stream As Stream) As Stream
oldStream = stream
newStream = New MemoryStream()
Return newStream
End Function
' When the SOAP extension is accessed for the first time, the XML Web
' service method it is applied to is accessed to store the file
' name passed in, using the corresponding SoapExtensionAttribute.
Public Overloads Overrides Function GetInitializer(methodInfo As _
LogicalMethodInfo, _
attribute As SoapExtensionAttribute) As Object
Return CType(attribute, TraceExtensionAttribute).Filename
End Function
' The SOAP extension was configured to run using a configuration file
' instead of an attribute applied to a specific XML Web service
' method. Return a file name based on the class implementing the Web
' Service's type.
Public Overloads Overrides Function GetInitializer(WebServiceType As _
Type) As Object
' Return a file name to log the trace information to, based on the
' type.
Return "C:\" + WebServiceType.FullName + ".log"
End Function
' Receive the file name stored by GetInitializer and store it in a
' member variable for this specific instance.
Public Overrides Sub Initialize(initializer As Object)
m_filename= CStr(initializer)
End Sub
' If the SoapMessageStage is such that the SoapRequest or SoapResponse
' is still in the SOAP format to be sent or received over the network,
' save it out to file.
Public Overrides Sub ProcessMessage(message As SoapMessage)
Select Case message.Stage
Case SoapMessageStage.BeforeSerialize
Case SoapMessageStage.AfterSerialize
WriteOutput(message)
Case SoapMessageStage.BeforeDeserialize
WriteInput(message)
Case SoapMessageStage.AfterDeserialize
Case Else
Throw New Exception("invalid stage")
End Select
End Sub
' Write the SOAP message out to a file.
Public Sub WriteOutput(message As SoapMessage)
newStream.Position = 0
Dim fs As New FileStream(m_filename, FileMode.Append, _
FileAccess.Write)
Dim w As New StreamWriter(fs)
w.WriteLine("-----Response at " + DateTime.Now.ToString())
w.Flush()
Copy(newStream, fs)
w.Close()
newStream.Position = 0
Copy(newStream, oldStream)
End Sub
' Write the SOAP message out to a file.
Public Sub WriteInput(message As SoapMessage)
Copy(oldStream, newStream)
Dim fs As New FileStream(m_filename, FileMode.Append, _
FileAccess.Write)
Dim w As New StreamWriter(fs)
w.WriteLine("----- Request at " + DateTime.Now.ToString())
w.Flush()
newStream.Position = 0
Copy(newStream, fs)
w.Close()
newStream.Position = 0
End Sub
Sub Copy(fromStream As Stream, toStream As Stream)
Dim reader As New StreamReader(fromStream)
Dim writer As New StreamWriter(toStream)
writer.WriteLine(reader.ReadToEnd())
writer.Flush()
End Sub
End Class
' Create a SoapExtensionAttribute for our SOAP Extension that can be
' applied to an XML Web service method.
<AttributeUsage(AttributeTargets.Method)> _
Public Class TraceExtensionAttribute
Inherits SoapExtensionAttribute
Private m_filename As String = "c:\log.txt"
Private m_priority As Integer
Public Overrides ReadOnly Property ExtensionType() As Type
Get
Return GetType(TraceExtension)
End Get
End Property
Public Overrides Property Priority() As Integer
Get
Return m_priority
End Get
Set
m_priority = value
End Set
End Property
Public Property Filename() As String
Get
Return m_filename
End Get
Set
m_filename= value
End Set
End Property
End Class
[C#]
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Net;
// Define a SOAP Extension that traces the SOAP request and SOAP
// response for the XML Web service method the SOAP extension is
// applied to.
public class TraceExtension : SoapExtension
{
Stream oldStream;
Stream newStream;
string filename;
// Save the Stream representing the SOAP request or SOAP response into
// a local memory buffer.
public override Stream ChainStream( Stream stream ){
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
// When the SOAP extension is accessed for the first time, the XML Web
// service method it is applied to is accessed to store the file
// name passed in, using the corresponding SoapExtensionAttribute.
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return ((TraceExtensionAttribute) attribute).Filename;
}
// The SOAP extension was configured to run using a configuration file
// instead of an attribute applied to a specific XML Web service
// method.
public override object GetInitializer(Type WebServiceType)
{
// Return a file name to log the trace information to, based on the
// type.
return "C:\\" + WebServiceType.FullName + ".log";
}
// Receive the file name stored by GetInitializer and store it in a
// member variable for this specific instance.
public override void Initialize(object initializer)
{
filename = (string) initializer;
}
// If the SoapMessageStage is such that the SoapRequest or
// SoapResponse is still in the SOAP format to be sent or received,
// save it out to a file.
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage) {
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
WriteOutput(message);
break;
case SoapMessageStage.BeforeDeserialize:
WriteInput(message);
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
public void WriteOutput(SoapMessage message){
newStream.Position = 0;
FileStream fs = new FileStream(filename, FileMode.Append,
FileAccess.Write);
StreamWriter w = new StreamWriter(fs);
string soapString = (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest";
w.WriteLine("-----" + soapString + " at " + DateTime.Now);
w.Flush();
Copy(newStream, fs);
w.Close();
newStream.Position = 0;
Copy(newStream, oldStream);
}
public void WriteInput(SoapMessage message){
Copy(oldStream, newStream);
FileStream fs = new FileStream(filename, FileMode.Append,
FileAccess.Write);
StreamWriter w = new StreamWriter(fs);
string soapString = (message is SoapServerMessage) ?
"SoapRequest" : "SoapResponse";
w.WriteLine("-----" + soapString +
" at " + DateTime.Now);
w.Flush();
newStream.Position = 0;
Copy(newStream, fs);
w.Close();
newStream.Position = 0;
}
void Copy(Stream from, Stream to)
{
TextReader reader = new StreamReader(from);
TextWriter writer = new StreamWriter(to);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}
}
// Create a SoapExtensionAttribute for the SOAP Extension that can be
// applied to an XML Web service method.
[AttributeUsage(AttributeTargets.Method)]
public class TraceExtensionAttribute : SoapExtensionAttribute {
private string filename = "c:\\log.txt";
private int priority;
public override Type ExtensionType {
get { return typeof(TraceExtension); }
}
public override int Priority {
get { return priority; }
set { priority = value; }
}
public string Filename {
get {
return filename;
}
set {
filename = value;
}
}
}
Voir aussi
SoapExtension | SoapExtensionAttribute | SoapMessageStage | LogicalMethodInfo | Anatomie de la durée de vie d'un service Web XML | Configuration d'applications | Création de services Web XML à l'aide d'ASP.NET | Création de clients de service Web XML