Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
TransactionFlow örneği, WS-Atomic transaction veya OleTransactions protokolünün kullanıldığı işlem akışı için istemci ve sunucu seçeneklerinin ve istemci eşgüdümlü işlemin kullanımını gösterir. Bu örnek, bir hesap makinesi hizmetini uygulayan Başlangıç temel alır, ancak işlemler, TransactionFlowAttribute ile TransactionFlowOption numaralandırmasını kullanarak işlem akışının ne ölçüde etkinleştirildiğini göstermek üzere belirlenmiştir. Akışı yapılan işlem kapsamında, istenen işlemlerin günlüğü bir veritabanına yazılır ve istemci eşgüdümlü işlemi tamamlanana kadar devam eder. İstemci işlemi tamamlanmazsa, Web hizmeti işlemi veritabanına uygun güncelleştirmelerin işlenmemesini sağlar.
Not
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Hizmetle ve bir işlemle bağlantı başlatdıktan sonra istemci birkaç hizmet işlemine erişir. Hizmet sözleşmesi, her biri TransactionFlowOptioniçin farklı bir ayar gösteren işlemlerle aşağıdaki gibi tanımlanır.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Add(double n1, double n2);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
double Subtract(double n1, double n2);
[OperationContract]
[TransactionFlow(TransactionFlowOption.NotAllowed)]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
Bu, işlemleri işlenme sırasına göre tanımlar:
Addişlem isteği, akışlı bir işlem içermelidir.Subtractişlem isteği, akışlı bir işlem içerebilir.Multiplyişlem isteği, açık bir NotAllowed ayarı kullanılarak akışa tabi bir işlem içermemelidir.Divideişlem isteği,TransactionFlowözniteliğinin atlandığı akışlı bir işlem içermemelidir.
İşlem akışını etkinleştirmek için, uygun işlem özniteliklerine ek olarak <transactionFlow> özelliği etkinleştirilmiş bağlamalar kullanılmalıdır. Bu örnekte hizmetin yapılandırması, Meta Veri Değişimi uç noktasına ek olarak bir TCP uç noktasını ve HTTP uç noktasını kullanıma sunar. TCP uç noktası ve HTTP uç noktası, her ikisi de <transactionFlow> özelliği etkin olan aşağıdaki bağlamaları kullanır.
<bindings>
<netTcpBinding>
<binding name="transactionalOleTransactionsTcpBinding"
transactionFlow="true"
transactionProtocol="OleTransactions"/>
</netTcpBinding>
<wsHttpBinding>
<binding name="transactionalWsatHttpBinding"
transactionFlow="true" />
</wsHttpBinding>
</bindings>
Not
Sistem tarafından sağlanan netTcpBinding, transactionProtocol belirtimine izin verirken, sistem tarafından sağlanan wsHttpBinding yalnızca daha birlikte çalışabilir WSAtomicTransactionOctober2004 protokollerini kullanır. OleTransactions protokolü yalnızca Windows Communication Foundation (WCF) istemcileri tarafından kullanılabilir.
ICalculator arabirimini uygulayan sınıf için, tüm yöntemler TransactionScopeRequiredolarak ayarlanmış true özelliğiyle ilişkilendirilir. Bu ayar, yönteminde gerçekleştirilir tüm eylemlerin bir işlem kapsamında gerçekleştiğini bildirir. Bu durumda yapılan eylemler günlük veritabanına kaydetmeyi içerir. İşlem isteği akışlı bir işlem içeriyorsa, eylemler gelen işlem kapsamında gerçekleşir veya yeni bir işlem kapsamı otomatik olarak oluşturulur.
Not
TransactionScopeRequired özelliği, hizmet yöntemi uygulamaları için yerel davranışı tanımlar ve istemcinin işlem akışı yapma becerisini veya gereksinimini tanımlamaz.
// Service class that implements the service contract.
[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CalculatorService : ICalculator
{
[OperationBehavior(TransactionScopeRequired = true)]
public double Add(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Adding {0} to {1}", n1, n2));
return n1 + n2;
}
[OperationBehavior(TransactionScopeRequired = true)]
public double Subtract(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Subtracting {0} from {1}", n2, n1));
return n1 - n2;
}
[OperationBehavior(TransactionScopeRequired = true)]
public double Multiply(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Multiplying {0} by {1}", n1, n2));
return n1 * n2;
}
[OperationBehavior(TransactionScopeRequired = true)]
public double Divide(double n1, double n2)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Dividing {0} by {1}", n1, n2));
return n1 / n2;
}
// Logging method omitted for brevity
}
İstemcide, hizmetin işlemlerdeki TransactionFlowOption ayarları istemcinin oluşturulan ICalculator arabirimi tanımına yansıtılır. Ayrıca hizmetin transactionFlow özellik ayarları istemcinin uygulama yapılandırmasına da yansıtılır. İstemci, uygun endpointConfigurationNameseçerek aktarım ve protokolü seçebilir.
// Create a client using either wsat or oletx endpoint configurations
CalculatorClient client = new CalculatorClient("WSAtomicTransaction_endpoint");
// CalculatorClient client = new CalculatorClient("OleTransactions_endpoint");
Not
Bu örneğin gözlemlenen davranışı, hangi protokol veya aktarım seçilirse seçiliyor olsun aynıdır.
Hizmet bağlantısını başlattıktan sonra istemci, hizmet işlemlerine yapılan çağrılar etrafında yeni bir TransactionScope oluşturur.
// Start a transaction scope
using (TransactionScope tx =
new TransactionScope(TransactionScopeOption.RequiresNew))
{
Console.WriteLine("Starting transaction");
// Call the Add service operation
// - generatedClient will flow the required active transaction
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine(" Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation
// - generatedClient will flow the allowed active transaction
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine(" Subtract({0},{1}) = {2}", value1, value2, result);
// Start a transaction scope that suppresses the current transaction
using (TransactionScope txSuppress =
new TransactionScope(TransactionScopeOption.Suppress))
{
// Call the Subtract service operation
// - the active transaction is suppressed from the generatedClient
// and no transaction will flow
value1 = 21.05D;
value2 = 42.16D;
result = client.Subtract(value1, value2);
Console.WriteLine(" Subtract({0},{1}) = {2}", value1, value2, result);
// Complete the suppressed scope
txSuppress.Complete();
}
// Call the Multiply service operation
// - generatedClient will not flow the active transaction
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine(" Multiply({0},{1}) = {2}", value1, value2, result);
// Call the Divide service operation.
// - generatedClient will not flow the active transaction
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine(" Divide({0},{1}) = {2}", value1, value2, result);
// Complete the transaction scope
Console.WriteLine(" Completing transaction");
tx.Complete();
}
Console.WriteLine("Transaction committed");
İşlemlere yapılan çağrılar aşağıdaki gibidir:
Addisteği gerekli işlemi hizmete akışla bildirir ve hizmetin eylemleri istemcinin işlemi kapsamında gerçekleşir.İlk
Subtractisteği de izin verilen işlemi hizmete akışla iletir ve hizmetin eylemleri istemcinin işlemi kapsamında gerçekleşir.İkinci
Subtractisteği,TransactionScopeOption.Suppressseçeneğiyle bildirilen yeni bir işlem kapsamı içinde gerçekleştirilir. Bu, istemcinin ilk harici işlemini bastırır ve istek, hizmete bir işlem akışı sağlamaz. Bu yaklaşım, istemcinin gerekli olmadığında hizmete bir işlem akışından açıkça vazgeçmesine ve bu işleme karşı koruma sağlamasına olanak tanır. Hizmetin eylemleri yeni ve bağlantısız bir işlem kapsamında gerçekleşir.İstemcinin
Multiplyarabiriminin oluşturduğu tanımıICalculatorTransactionFlowAttributeolarak ayarlanmış bir TransactionFlowOption içerdiğindenNotAllowedisteği hizmete bir işlem akışı yapmaz.İstemcinin
Dividearabiriminin oluşturulan tanımı birICalculatoriçermediğindenTransactionFlowAttributeisteği hizmete bir işlem akışı yapmaz. Hizmetin eylemleri yeniden başka bir yeni ve bağlantısız işlem kapsamında gerçekleşir.
Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.
Starting transaction
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Subtract(21.05,42.16) = -21.11
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Completing transaction
Transaction committed
Press <ENTER> to terminate client.
Hizmet işlemi isteklerinin günlüğü, hizmetin konsol penceresinde görüntülenir. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.
Press <ENTER> to terminate the service.
Writing row to database: Adding 100 to 15.99
Writing row to database: Subtracting 76.54 from 145
Writing row to database: Subtracting 42.16 from 21.05
Writing row to database: Multiplying 9 by 81.25
Writing row to database: Dividing 22 by 7
Başarılı bir yürütmeden sonra, istemcinin işlem kapsamı tamamlanır ve bu kapsamda yapılan tüm eylemler taahhüt edilir. Özellikle, belirtilen 5 kayıt hizmetin veritabanında kalıcıdır. Bunlardan ilk 2'i istemcinin işlemi kapsamında gerçekleşmiştir.
Eğer istemcinin TransactionScope içinde herhangi bir yerde bir özel durum oluşursa, işlem tamamlanamaz. Bu, bu kapsamda günlüğe kaydedilen kayıtların veritabanına işlenmemelerine neden olur. Bu etki, dış TransactionScope'ı tamamlamak için yapılan çağrıyı devre dışı bırakmanızdan sonra örnek çalıştırmayı tekrar ederek gözlemlenebilir. Böyle bir çalışmada, istemci işlemi bunlara geçmediği için yalnızca son 3 eylem (ikinci Subtract, Multiply ve Divide istekleri) günlüğe kaydedilir.
Örneği ayarlamak, derlemek ve çalıştırmak için
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
SQL Server Express Edition veya SQL Server yüklediğinizden ve bağlantı dizesinin hizmetin uygulama yapılandırma dosyasında doğru ayarlandığından emin olun. Veritabanını kullanmadan örneği çalıştırmak için hizmetin uygulama yapılandırma dosyasındaki
usingSqldeğerinifalseolarak ayarlayın.Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.
Not
Makineler arası yapılandırma için, aşağıdaki yönergeleri kullanarak Dağıtılmış İşlem Düzenleyicisi'ni etkinleştirin ve WCF İşlemleri ağ desteğini etkinleştirmek için Windows SDK'sından WsatConfig.exe aracını kullanın. WsatConfig.exeayarlama hakkında bilgi için bkz. yapılandırma WS-Atomic İşlem Desteği.
Örneği aynı bilgisayarda veya farklı bilgisayarlarda çalıştırdığınızda, Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) ağ işlem akışını etkinleştirecek şekilde yapılandırmanız ve WCF işlemleri ağ desteğini etkinleştirmek için WsatConfig.exe aracını kullanmanız gerekir.
Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) örneği çalıştırmayı destekleyecek şekilde yapılandırmak için
Windows Server 2003 veya Windows XP çalıştıran bir hizmet makinesinde, bu yönergeleri izleyerek MSDTC'yi gelen ağ işlemlerine izin verecek şekilde yapılandırın.
Başlat menüsünden Denetim Masasıgidin, ardından Yönetim Araçları ve bileşen hizmetleri .
Bileşen Hizmetleribölümünü genişletin. Bilgisayarlar klasörünü açın.
Bilgisayarım öğesine sağ tıklayın ve Özellikleröğesini seçin.
MSDTC sekmesinde Güvenlik Yapılandırmasıöğesine tıklayın.
Ağ DTC Erişimini kontrol edin ve Gelen İzin Ver.
MSDTC hizmetini yeniden başlatmak için Tamam'a tıklayın, ardından Evet'e tıklayın.
İletişim kutusunu kapatmak için Tamam'e tıklayın.
Windows Server 2008 veya Windows Vista çalıştıran bir hizmet makinesinde, bu yönergeleri izleyerek MSDTC'yi gelen ağ işlemlerine izin verecek şekilde yapılandırın.
Başlat menüsünden Denetim Masasıgidin, ardından Yönetim Araçları ve bileşen hizmetleri .
Bileşen Hizmetleribölümünü genişletin. Bilgisayarlar klasörünü açın. Dağıtılmış İşlem Düzenleyicisiseçin.
DTC Koordinatörü üzerine sağ tıklayın ve Özellikleröğesini seçin.
Güvenlik sekmesinde, Ağ DTC Erişimini denetleyin ve Geleniçin İzin Ver.
MSDTC hizmetini yeniden başlatmak için Tamam'a tıklayın, ardından Evet'e tıklayın.
İletişim kutusunu kapatmak için Tamam'e tıklayın.
İstemci makinesinde MSDTC'yi giden ağ işlemlerine izin verecek şekilde yapılandırın:
Başlangıç menüsünden
Control Panelöğesine gidin, ardından Yönetim Araçları ve bileşen hizmetleri .Bilgisayarım öğesine sağ tıklayın ve Özellikleröğesini seçin.
MSDTC sekmesinde Güvenlik Yapılandırmasıöğesine tıklayın.
Ağ DTC Erişim denetleyin ve ile Giden 'eİzin Ver.
MSDTC hizmetini yeniden başlatmak için Tamam'a tıklayın, ardından Evet'e tıklayın.
İletişim kutusunu kapatmak için Tamam'e tıklayın.