Partager via


Participation aux transactions dans les services Web XML créés à l'aide d'ASP.NET

La prise en charge des transactions pour les services Web XML tire parti de celle qui se trouve dans le Common Language Runtime, fondée sur le même modèle de transactions distribuées que celui de Microsoft Transaction Server (MTS) et des services COM+. Le modèle consiste à décider de manière déclarative si un objet participe à une transaction plutôt que d'écrire du code spécifique pour gérer la validation et la l'annulation d'une transaction. Pour un service Web XML créé à l'aide d'ASP.NET, vous pouvez déclarer un comportement transactionnel en définissant la propriété TransactionOption de l'attribut WebMethod appliquée à une méthode de service Web XML. Si une exception est levée alors que la méthode de service Web XML est en cours d'exécution, la transaction est automatiquement abandonnée ; inversement, si aucune n'exception ne survient, la transaction est automatiquement validée.

La propriété TransactionOption de l'attribut WebMethod spécifie comment une méthode de service Web XML participe à une transaction. Bien que ce niveau déclaratif représente la logique d'une transaction, il se situe à un niveau en deçà de la transaction physique. Une transaction physique se produit lorsqu'un objet transactionnel accède à une ressource de données telle qu'une base de données ou une file d'attente de messages. La transaction associée à l'objet passe automatiquement au gestionnaire de ressources approprié. Un fournisseur de données .NET Framework, tel que le fournisseur de données .NET Framework pour SQL Server ou le fournisseur de données .NET Framework pour OLE DB, recherche la transaction dans le contexte de l'objet et l'inscrit dans la transaction par le biais du coordinateur de transactions distribuées (DTC, Distributed Transaction Coordinator). L'ensemble de la transaction se déroule de façon automatique.

Les méthodes de service Web XML ne peuvent participer à une transaction qu'à la racine d'une nouvelle transaction. Comme la racine d'une nouvelle transaction, toutes les interactions avec les gestionnaires de ressources tels que Microsoft SQL Server, MSMQ et Microsoft Host Integration Server conservent les propriétés ACID nécessaires à l'exécution d'applications distribuées robustes. Les méthodes de service Web XML qui en appellent d'autres participent à différentes transactions, car les transactions ne passent pas à travers ces méthodes.

Pour participer à une transaction à partir d'une méthode de service Web XML

  1. Déclarez un service Web XML.

    <%@ WebService Language="C#" Class="Orders" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="Orders" %>
    
  2. Ajoutez une directive Assembly à System.EnterpriseServices.

    <%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
    
  3. Ajoutez des références aux espaces de noms System.Web.Services et System.EnterpriseServices.

    using System.Web.Services;
    using System.EnterpriseServices;
    [Visual Basic]
    Imports System.Web.Services
    Imports System.EnterpriseServices
    
  4. Déclarez une méthode de service Web XML, en affectant TransactionOption.RequiresNew à la propriété TransactionOption de l'attribut WebMethod.

    [ WebMethod(TransactionOption=TransactionOption.RequiresNew)]
    public int DeleteAuthor(string lastName)  
    [Visual Basic]
    < WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
    Public Function DeleteAuthor(lastName As String) As Integer
    

L'exemple de code suivant illustre un service Web XML qui expose une seule méthode appelée DeleteDatabase. Cette méthode exécute une opération de base de données ayant comme portée une transaction. Si l'opération de base de données ne lève pas d'exception, la transaction s'arrête automatiquement ; sinon elle est automatiquement validée.

<%@ WebService Language="C#" Class="Orders" %>
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
using System.EnterpriseServices;

public class Orders : WebService
{
   [ WebMethod(TransactionOption=TransactionOption.RequiresNew)]
   public int DeleteAuthor(string lastName)  
   {
      String deleteCmd = "DELETE FROM authors WHERE au_lname='" + 
                          lastName + "'" ;
      String exceptionCausingCmdSQL = "DELETE FROM NonExistingTable WHERE
                                       au_lname='" + lastName + "'" ;

      SqlConnection sqlConn = new SqlConnection(
        "Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver");

      SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL,sqlConn);
      SqlCommand exceptionCausingCmd = new
                 SqlCommand(exceptionCausingCmdSQL,sqlConn);
   
      // This command should execute properly.
      deleteCmd.Connection.Open();
      deleteCmd.ExecuteNonQuery();

      // This command results in an exception, so the first command is
      // automatically rolled back.  Since the XML Web service method is
      // participating in a transaction, and an exception occurs, ASP.NET
      // automatically aborts the transaction.  The deleteCmd that
      // executed properly is rolled back.

      int cmdResult = exceptionCausingCmd.ExecuteNonQuery();

      sqlConn.Close();
       
      return cmdResult;
   }
}
[Visual Basic]
<%@ WebService Language="VB" Class="Orders" %>
<%@ assembly name="System.EnterpriseServices" %>

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.Services
Imports System.Web.Util
Imports System.EnterpriseServices

Public Class  Orders

 <WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
 Public Function DeleteAuthor (lastName as String) as Integer   
     
   Dim deleteCmdSQL As String = "DELETE FROM authors WHERE au_lname='" + _ 
                          lastName + "'" 
   Dim exceptionCausingCmdSQL As String = "DELETE FROM " + _
      "NonExistingTable WHERE au_lname='" + lastName + "'" 

   Dim sqlConn As SqlConnection = New SqlConnection( _
        "Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver")

   Dim deleteCmd As SqlCommand  = New SqlCommand(deleteCmdSQL,sqlConn)
   Dim exceptionCausingCmd As SqlCommand  = New _
                 SqlCommand(exceptionCausingCmdSQL,sqlConn)
   
   ' This command should execute properly.
   deleteCmd.Connection.Open()
   deleteCmd.ExecuteNonQuery()

   ' This command results in an exception, so the first command is
   ' automatically rolled back. Since the XML Web service method is
   ' participating in a transaction, and an exception occurs, ASP.NET
   ' automatically aborts the transaction. The deleteCmd that
   ' executed properly is rolled back.

   Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery()
   sqlConn.Close()
   
   Return cmdResult
  End Function
End Class

Remarque Lorsque la méthode implémentant la méthode de service Web XML n'est pas appelée, à cause d'une demande Internet du fichier portant l'extension .asmx dans laquelle elle réside ou avec lequel elle est associée, la valeur de la propriété TransactionOption reste sans effet. Cela peut arriver lorsque la classe dans laquelle réside la méthode est membre d'un projet de Visual Studio .NET et que le service Web XML n'est pas appelé à l'aide d'une classe proxy. Dans Visual Studio .NET, une classe proxy est générée lors de l'ajout d'une référence Web.

Voir aussi

Traitement des transactions | TransactionOption, énumération | WebMethodAttribute.TransactionOption, propriété | Création de services Web XML à l'aide d'ASP.NET