Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Transaktionsunterstützung für XML-Webdienste nutzt den vollen Umfang der in der Common Language Runtime enthaltenen Unterstützung, die auf demselben verteilten Transaktionsmodell von Microsoft Transaction Server (MTS) und der COM+-Dienste basiert. Das Modell verwendet Deklarationen, um zu entscheiden, ob ein Objekt an einer Transaktion beteiligt ist. Es basiert nicht auf dem Schreiben spezifischen Codes, der das Commit und Rollback einer Transaktion verarbeitet. Bei einem mit ASP.NET erstellten XML-Webdienst können Sie das Transaktionsverhalten eines XML-Webdienstes deklarieren, indem Sie die TransactionOption-Eigenschaft des WebMethod-Attributs festlegen, das auf eine XML-Webdienstmethode angewendet wird. Wenn beim Ausführen der XML-Webdienstmethode eine Ausnahme ausgelöst wird, wird die Transaktion automatisch abgebrochen. Wenn jedoch keine Ausnahme auftritt, wird automatisch ein Commit der Transaktion ausgeführt.
Durch die TransactionOption-Eigenschaft des WebMethod-Attributs wird festgelegt, in welcher Weise eine XML-Webdienstmethode an einer Transaktion beteiligt ist. Obwohl diese deklarative Ebene die Transaktionslogik darstellt, ist diese Ebene der eigentlichen physischen Transaktion vorgelagert. Eine physische Transaktion findet dann statt, wenn ein Transaktionsobjekt auf eine Datenressource zugreift, z. B. eine Datenbank oder eine Meldungswarteschlange. Die dem Objekt zugeordnete Transaktion wird automatisch an den entsprechenden Ressourcen-Manager übergeben. Ein .NET Framework-Datenprovider, z. B. der .NET Framework-Datenprovider für SQL Server oder der .NET Framework-Datenprovider für OLE DB, sucht im Kontext des Objekts nach der Transaktion und trägt sich über DTC (Distributed Transaction Coordinator) in der Transaktion ein. Die gesamte Transaktion erfolgt automatisch.
XML-Webdienstmethoden können nur als Stammmethode einer neuen Transaktion an einer Transaktion teilnehmen. Als Ausgangspunkt einer neuen Transaktion werden bei allen Interaktionen mit Ressourcen-Managern, z. B. Servern unter Microsoft SQL Server, Microsoft Message Queuing (MSMQ) und Microsoft Host Integration Server, die für eine zuverlässige Ausführung verteilter Anwendungen erforderlichen ACID-Eigenschaften beibehalten. XML-Webdienstmethoden, die andere XML-Webdienstmethoden aufrufen, sind an anderen Transaktionen beteiligt, da Transaktionen die Grenzen von XML-Webdienstmethoden nicht überschreiten.
So nehmen Sie an einer Transaktion einer XML-Webdienstmethode teil
Deklarieren Sie einen XML-Webdienst.
<%@ WebService Language="C#" Class="Orders" %> [Visual Basic] <%@ WebService Language="VB" Class="Orders" %>Fügen Sie System.EnterpriseServices eine Assembly-Direktive hinzu.
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>Fügen Sie Verweise auf den System.Web.Services-Namespace und den System.EnterpriseServices-Namespace hinzu.
using System.Web.Services; using System.EnterpriseServices; [Visual Basic] Imports System.Web.Services Imports System.EnterpriseServicesDeklarieren Sie eine XML-Webdienstmethode, und legen Sie dabei die TransactionOption-Eigenschaft des WebMethod-Attributs auf TransactionOption.RequiresNew fest.
[ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) [Visual Basic] < WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _ Public Function DeleteAuthor(lastName As String) As Integer
Das folgende Codebeispiel zeigt einen XML-Webdienst, der eine einzelne XML-Webdienstmethode mit der Bezeichnung DeleteDatabase zur Verfügung stellt. Diese XML-Webdienstmethode führt eine Datenbankoperation innerhalb des Gültigkeitsbereichs einer Transaktion durch. Wenn durch die Datenbankoperation eine Ausnahme ausgelöst wird, wird die Transaktion automatisch angehalten; andernfalls wird die Transaktion automatisch in einem Commit übergeben.
<%@ 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
Hinweis Wenn die Methode, die die XML-Webdienstmethode implementiert, wegen einer Internetanforderung für eine Datei mit der Erweiterung .asmx, in der sie sich befindet oder der sie zugeordnet ist, nicht aufgerufen wird, hat der Wert der TransactionOption-Eigenschaft keine Auswirkungen. Dies ist z. B. der Fall, wenn die Klasse, in der sich die Methode befindet, ein Member eines Projekts innerhalb von Visual Studio .NET ist und der XML-Webdienst nicht mit einer Proxyklasse aufgerufen wird. In Visual Studio .NET wird eine Proxyklasse beim Hinzufügen eines Webverweises erstellt.
Siehe auch
Verarbeiten von Transaktionen | TransactionOption-Enumeration | WebMethodAttribute.TransactionOption-Eigenschaft | Erstellen von XML-Webdiensten mit ASP.NET