Die Transaktionsunterstützung für XML-Webdienste nutzt die Unterstützung in der Common Language Runtime, die auf demselben verteilten Transaktionsmodell basiert, das auch in Microsoft Transaction Server (MTS) und COM+ Services zu finden ist. Dieses Modell basiert darauf, explizit zu bestimmen, ob ein Objekt an einer Transaktion teilnimmt, anstatt spezifischen Code zu schreiben, um Delegierungen und Rückrufe für eine Transaktion zu verarbeiten. Für einen mit ASP.NET erstellten XML-Webdienst können Sie das Transaktionsverhalten eines XML-Webdiensts deklarieren, indem Sie das TransactionOption-Attribut des WebMethod-Attributs festlegen, das für eine XML-Webdienstmethode gilt. Wenn beim Ausführen der XML-Webdienstmethode eine Ausnahme ausgelöst wird, wird die Transaktion automatisch beendet. Wenn keine Ausnahme auftritt, wird die Transaktion automatisch delegiert.
Das TransactionOption-Attribut des WebMethod-Attributs gibt an, wie eine XML-Webdienstmethode an einer Transaktion teilnimmt. Obwohl diese Deklarationsebene eine Transaktionslogik darstellt, ist sie einen Schritt von der eigentlichen Transaktion entfernt. Die eigentliche Transaktion findet statt, wenn ein Transaktionsobjekt auf eine Datenquelle (z. B. eine Datenbank oder eine Nachrichtenwarteschlange) zugreift. Mit diesem Objekt verknüpfte Transaktionen fließen automatisch an den entsprechenden Ressourcenmanager. Ein .NET Framework-Datenanbieter wie der .NET Framework-Datenanbieter (für SQL Server oder OLE DB) sucht nach Transaktionen im Kontext eines Objekts und katalogisiert sie über einen Distributed Transaction Coordinator (DTC, Distributed Transaction Coordinator). Alle Transaktionen werden automatisch generiert.
XML-Webdienstmethoden können nur an einer Transaktion teilnehmen, die den Stamm einer neuen Transaktion darstellt. Als Stamm einer neuen Transaktion behalten alle Interaktionen mit Ressourcenmanagern (z. B. Servern, auf denen Microsoft SQL Server, Microsoft Message Queuing und Microsoft Host Integration Server ausgeführt werden) die ACID-Eigenschaften bei, die zum Ausführen robuster verteilter Anwendungen erforderlich sind. XML-Webdienstmethoden, die andere XML-Webdienstmethoden aufrufen, nehmen an unterschiedlichen Transaktionen teil, da Transaktionen nicht über XML-Webdienstmethoden fließen.
Deklarieren Sie einen XML-Webdienstmithilfe von Transaktionen aus XML-Webdienstmethoden
.
[C#]
<%@ WebService Language="C#" Class="Orders" %>
[Visual Basic]
<%@ WebService Language="VB" Class="Orders" %>
Fügen Sie System.EnterpriseServices eine Assemblyanweisung hinzu.
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
Fügen Sie Verweise auf die Domänennamensräume System.Web.Services und System.EnterpriseServices hinzu.
[C#]
Verwenden von System.Web.Services;
mit System.EnterpriseServices;
[Visual Basic]
Importiert System.Web.Services
Imports System.EnterpriseServices
deklariert eine XML-Webdienstmethode und legt die TransactionOption-Eigenschaft des WebMethod-Attributs auf TransactionOption.RequiresNew fest.
[C#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string lastName)
[Visual Basic]
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Öffentliche Funktion DeleteAuthor(lastName As String) As Integer
Das folgende Codebeispiel zeigt einen XML-Webdienst, der eine einzelne XML-Webdienstmethode verwendet und „DeleteDatabase“ aufruft. Diese XML-Webdienstmethode führt einen Datenbankvorgang im Rahmen einer Transaktion aus. Wenn der Datenbankvorgang eine Ausnahme auslöst, wird die Transaktion automatisch gestoppt; andernfalls wird die Transaktion automatisch festgeschrieben.
[C#]
<%@ WebService Language="C#" Class="Orders" %>
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
Verwenden des Systems;
Verwenden von System.Data;
Verwenden von System.Data.SqlClient;
Verwenden von System.Web.Services;
mit System.EnterpriseServices;
öffentliche Klasse Orders: WebService
{
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string lastName)
{
String deleteCmd = „DELETE FROM Authors WHERE au_lname='“ +
Nachname + "'" ;
StringExceptionCausingCmdSQL = „DELETE FROM NonExistingTable WHERE
au_lname='" + lastName + "'" ;
SqlConnection sqlConn = new SqlConnection(
„Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver“)
;
SqlCommand-AusnahmeCausingCmd = neu
SqlCommand(ExceptionCausingCmdSQL,sqlConn);
// Dieser Befehl sollte ordnungsgemäß ausgeführt werden.
deleteCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// Dieser Befehl führt zu einer Ausnahme, daher ist der erste Befehl
// automatisch zurückgesetzt. Da die XML-Webdienstmethode ist
// An einer Transaktion teilnehmen und eine Ausnahme auftritt, ASP.NET
// bricht die Transaktion automatisch ab
// ordnungsgemäß ausgeführt wird zurückgesetzt.
int cmdResult =ExceptionCausingCmd.ExecuteNonQuery()
;
return cmdResult;
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="Orders" %>
<%@ Assembly Name="System.EnterpriseServices" %>
Importiert System
ImportsSystem.Data
Importiert System.Data.SqlClient
Importiert System.Web.Services
Importiert System.Web.Util
Importiert System.EnterpriseServices
Public Class Orders
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Öffentliche Funktion DeleteAuthor (lastName as String) as Integer
Dim deleteCmdSQL As String = "DELETE FROM Authors WHERE au_lname='" + _
Nachname + „'“
DimExceptionCausingCmdSQL 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)
Ausnahme verursachendenCmd als SqlCommand = New verdunkeln _
SqlCommand(ExceptionCausingCmdSQL,sqlConn)
' Dieser Befehl sollte ordnungsgemäß ausgeführt werden.
deleteCmd.Connection.Open()
deleteCmd.ExecuteNonQuery()
' Dieser Befehl führt zu einer Ausnahme, daher ist der erste Befehl
' wird automatisch zurückgesetzt. Da die XML-Webdienstmethode vorhanden ist
' an einer Transaktion beteiligt ist und eine Ausnahme auftritt, ASP.NET
' bricht die Transaktion automatisch ab
,
wird zurückgesetzt.
sqlConn.Close()
Gibt cmdResult zurück
Funktion beenden
Unterricht beenden