Condividi tramite


Partecipazione a transazioni dei servizi Web XML creati con ASP.NET

Il supporto delle transazioni per i servizi Web XML è basato sul supporto offerto da Common Language Runtime, il quale, a sua volta, è basato sullo stesso modello di transazioni distribuite disponibile in Microsoft Transaction Server (MTS) e nei servizi COM+. Il modello è basato sulla decisione dichiarativa di far partecipare o meno un oggetto a una transazione, anziché sullo scrittura di codice specifico per la gestione di commit e rollback di una transazione. È possibile dichiarare un comportamento transazionale di un servizio Web XML creato con ASP.NET impostando la proprietà TransactionOption dell'attributo WebMethod applicato a un metodo del servizio Web XML. Se viene generata un'eccezione durante l'esecuzione del metodo di servizio Web XML, la transazione viene automaticamente annullata. In caso contrario, viene eseguito il commit automatico della transazione.

La proprietà TransactionOption dell'attributo WebMethod specifica la modalità di partecipazione a una transazione del metodo di servizio Web XML. Sebbene questo livello dichiarativo rappresenti la logica di una transazione, è un passaggio che potrà essere omesso in sede di transazione fisica. Una transazione fisica ha luogo quando un oggetto transazionale accede a una risorsa di dati, quale un database o una coda di messaggi. La transazione associata all'oggetto viene automaticamente passata al gestore delle risorse appropriato. Un provider di dati .NET Framework, quale il provider di dati .NET Framework per SQL Server o il provider di dati .NET Framework per OLE DB, cerca la transazione nel contesto dell'oggetto e vi si inserisce tramite Distributed Transaction Coordinator (DTC). L'intera transazione viene eseguita automaticamente.

I metodi di servizio Web XML possono partecipare a una transazione solo come radice di una nuova transazione, poiché, in tal modo, tutte le interazioni con i gestori delle risorse, quali i server su cui sono eseguiti Microsoft SQL Server, i servizi di accodamento messaggi Microsoft (MSMQ, Microsoft Message Queuing), Oracle e SNA, mantengono le proprietà ACID necessarie per l'esecuzione di applicazioni distribuite efficienti. I metodi di servizio Web XML che chiamano altri metodi di servizio Web XML partecipano a più transazioni, in quanto le transazioni non passano dai metodi di servizio Web XML.

Per partecipare a una transazione da un metodo di servizio Web XML

  1. Dichiarare un servizio Web XML.

    <%@ WebService Language="C#" Class="Orders" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="Orders" %>
    
  2. Aggiungere una direttiva Assembly a System.EnterpriseServices.

    <%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
    
  3. Aggiungere riferimenti agli spazi dei nomi System.Web.Services e System.EnterpriseServices.

    using System.Web.Services;
    using System.EnterpriseServices;
    [Visual Basic]
    Imports System.Web.Services
    Imports System.EnterpriseServices
    
  4. Dichiarare un metodo del servizio Web XML e impostare la proprietà TransactionOption dell'attributo WebMethod su TransactionOption.RequiresNew.

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

Nell'esempio di codice seguente viene mostrato il servizio Web XML che espone un unico metodo di servizio Web XML, denominato DeleteDatabase. Il metodo di servizio Web XML esegue un'operazione di database inserita nell'ambito di una transazione. Se l'operazione non genera alcuna eccezione, la transazione viene interrotta automaticamente. In caso contrario, viene eseguito il commit automatico della transazione.

<%@ 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

Nota Quando il metodo con cui si implementa il metodo del servizio Web XML non viene chiamato per effetto di una richiesta Internet del file con estensione ASMX in cui risiede o a cui è associato, il valore della proprietà TransactionOption non avrà alcun effetto. Questo caso può verificarsi quando la classe in cui il metodo risiede è un membro di un progetto Visual Studio .NET e il servizio Web XML non viene richiamato utilizzando una classe proxy. In Visual Studio .NET, le classi proxy vengono generate all'aggiunta di un riferimento Web.

Vedere anche

Elaborazione delle transazioni | Enumerazione TransactionOption | Proprietà WebMethodAttribute.TransactionOption | Generazione di servizi Web XML mediante ASP.NET