La prise en charge des transactions pour les services Web XML exploite la prise en charge du Common Language Runtime, qui est basé sur le même modèle de transaction distribué que celui trouvé dans Microsoft Transaction Server (MTS) et COM+ Services. Ce modèle est basé sur la détermination explicite si un objet participe à une transaction, plutôt que sur l'écriture de code spécifique pour gérer la délégation et les rappels pour une transaction. Pour un service Web XML créé à l'aide d'ASP.NET, vous pouvez déclarer le comportement transactionnel d'un service Web XML en définissant l'attribut TransactionOption de l'attribut WebMethod qui s'applique à une méthode de service Web XML. Si une exception est levée lors de l'exécution de la méthode du service Web XML, la transaction se termine automatiquement ; au contraire, si aucune exception ne se produit, la transaction est automatiquement déléguée.
L'attribut TransactionOption de l'attribut WebMethod spécifie la manière dont une méthode de service Web XML participe à une transaction. Bien que ce niveau de déclaration représente une logique de transaction, il s'éloigne de la transaction réelle. La transaction réelle se produit lorsqu'un objet de transaction accède à une source de données (telle qu'une base de données ou une file d'attente de messages). Les transactions associées à cet objet sont automatiquement transmises au gestionnaire de ressources approprié. Un fournisseur de données .NET Framework comme le fournisseur de données .NET Framework (pour SQL Server ou OLE DB) recherche les transactions dans le contexte d'un objet et les catalogue via un coordinateur de transactions distribuées (DTC, Distributed Transaction Coordination). Toutes les transactions sont générées automatiquement.
Les méthodes de service Web XML ne peuvent participer qu'à une transaction qui est la racine d'une nouvelle transaction. En tant que racine d'une nouvelle transaction, toutes les interactions avec les gestionnaires de ressources (tels que les serveurs exécutant Microsoft SQL Server, Microsoft Message Queuing et Microsoft Host Integration Server) conservent les propriétés ACID requises pour exécuter des applications distribuées robustes. Les méthodes de service Web XML qui appellent d'autres méthodes de service Web XML participent à différentes transactions, car les transactions ne transitent pas par les méthodes de service Web XML.
Déclarez un service Web XMLà l'aide des transactions des méthodes du service Web XML
.
[C#]
<%@ WebService Language="C#" Class="Commandes" %>
[Visuel Basique]
<%@ WebService Language="VB" Class="Orders" %>
Ajoutez une instruction d'assemblage à System.EnterpriseServices.
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
Ajoutez des références aux espaces de noms de domaine System.Web.Services et System.EnterpriseServices.
[C#]
en utilisant System.Web.Services ;
en utilisant System.EnterpriseServices ;
[Visuel Basique]
Importe System.Web.Services
Imports System.EnterpriseServices
déclare une méthode de service Web XML et définit la propriété TransactionOption de l'attribut WebMethod sur TransactionOption.RequiresNew.
[C#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int SupprimerAuthor (chaîne nom de famille)
[Visuel Basique]
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Fonction publique DeleteAuthor(lastName As String) As Integer
L'exemple de code suivant montre un service Web XML utilisant une seule méthode de service Web XML, appelant DeleteDatabase. Cette méthode de service Web XML effectue une opération de base de données dans le cadre d'une transaction. Si l'opération de base de données lève une exception, la transaction est automatiquement arrêtée ; sinon, la transaction est automatiquement validée.
[C#]
<%@ WebService Language="C#" Class="Commandes" %>
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
utiliser le système ;
en utilisant System.Data ;
en utilisant System.Data.SqlClient ;
en utilisant System.Web.Services ;
en utilisant System.EnterpriseServices ;
commandes de classe publique : WebService
{
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int SupprimerAuthor (chaîne nom de famille)
{
String deleteCmd = "DELETE FROM auteurs WHERE au_lname='" +
nom + "'" ;
String exceptionCausingCmdSQL = "DELETE FROM NonExistingTable WHERE
au_lname='" + nom + "'" ;
SqlConnection sqlConn = new SqlConnection(
"Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver");
SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL,sqlConn);
Exception SqlCommandCausingCmd = nouveau
SqlCommand(exceptionCausingCmdSQL,sqlConn);
// Cette commande doit s'exécuter correctement.
deleteCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// Cette commande génère une exception, donc la première commande est
// automatiquement annulé puisque la méthode du service Web XML est
// participe à une transaction et une exception se produit, ASP.NET
// abandonne automatiquement la transaction.
// exécuté correctement est annulé
int cmdResult = exceptionCausingCmd.ExecuteNonQuery(
)
;
}
}
[Visuel Basique]
<%@ WebService Language="VB" Class="Commandes" %>
<%@ assembly name="System.EnterpriseServices" %>
Importe le système
ImportsSystem.Data
Importe System.Data.SqlClient
Importe System.Web.Services
Importe System.Web.Util
Importe
les commandes de classe publique
System.EnterpriseServices<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Fonction publique DeleteAuthor (lastName as String) as Integer
Dim deleteCmdSQL As String = "DELETE FROM auteurs WHERE au_lname='" + _
nom + "'"
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)
'Cette commande doit s'exécuter correctement.
deleteCmd.Connection.Open()
deleteCmd.ExecuteNonQuery()
' Cette commande génère une exception, donc la première commande est
' automatiquement annulé puisque la méthode du service Web XML est.
' participant à une transaction et qu'une exception se produit, ASP.NET
' abandonne automatiquement la transaction.
' exécuté correctement est annulé.
Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery()
sqlConn.Close()
Renvoie cmdResult
Fonction de fin
Fin du cours