Aracılığıyla paylaş


WS İşlem Akışı

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:

  • Add işlem isteği, akışlı bir işlem içermelidir.

  • Subtract işlem isteği, akışlı bir işlem içerebilir.

  • Multiply işlem isteği, açık bir NotAllowed ayarı kullanılarak akışa tabi bir işlem içermemelidir.

  • Divide iş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:

  • Add isteği gerekli işlemi hizmete akışla bildirir ve hizmetin eylemleri istemcinin işlemi kapsamında gerçekleşir.

  • İlk Subtract isteği de izin verilen işlemi hizmete akışla iletir ve hizmetin eylemleri istemcinin işlemi kapsamında gerçekleşir.

  • İkinci Subtract isteği, TransactionScopeOption.Suppress seç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 Multiply arabiriminin oluşturduğu tanımı ICalculatorTransactionFlowAttributeolarak ayarlanmış bir TransactionFlowOption içerdiğinden NotAllowed isteği hizmete bir işlem akışı yapmaz.

  • İstemcinin Divide arabiriminin oluşturulan tanımı bir ICalculatoriçermediğinden TransactionFlowAttribute isteğ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

  1. Çö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.

  2. 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 usingSql değerini falseolarak ayarlayın.

  3. Ö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

  1. 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.

    1. Başlat menüsünden Denetim Masasıgidin, ardından Yönetim Araçları ve bileşen hizmetleri .

    2. Bileşen Hizmetleribölümünü genişletin. Bilgisayarlar klasörünü açın.

    3. Bilgisayarım öğesine sağ tıklayın ve Özellikleröğesini seçin.

    4. MSDTC sekmesinde Güvenlik Yapılandırmasıöğesine tıklayın.

    5. Ağ DTC Erişimini kontrol edin ve Gelen İzin Ver.

    6. MSDTC hizmetini yeniden başlatmak için Tamam'a tıklayın, ardından Evet'e tıklayın.

    7. İletişim kutusunu kapatmak için Tamam'e tıklayın.

  2. 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.

    1. Başlat menüsünden Denetim Masasıgidin, ardından Yönetim Araçları ve bileşen hizmetleri .

    2. Bileşen Hizmetleribölümünü genişletin. Bilgisayarlar klasörünü açın. Dağıtılmış İşlem Düzenleyicisiseçin.

    3. DTC Koordinatörü üzerine sağ tıklayın ve Özellikleröğesini seçin.

    4. Güvenlik sekmesinde, Ağ DTC Erişimini denetleyin ve Geleniçin İzin Ver.

    5. MSDTC hizmetini yeniden başlatmak için Tamam'a tıklayın, ardından Evet'e tıklayın.

    6. İletişim kutusunu kapatmak için Tamam'e tıklayın.

  3. İstemci makinesinde MSDTC'yi giden ağ işlemlerine izin verecek şekilde yapılandırın:

    1. Başlangıç menüsünden Control Panelöğesine gidin, ardından Yönetim Araçları ve bileşen hizmetleri .

    2. Bilgisayarım öğesine sağ tıklayın ve Özellikleröğesini seçin.

    3. MSDTC sekmesinde Güvenlik Yapılandırmasıöğesine tıklayın.

    4. Ağ DTC Erişim denetleyin ve ile Giden 'eİzin Ver.

    5. MSDTC hizmetini yeniden başlatmak için Tamam'a tıklayın, ardından Evet'e tıklayın.

    6. İletişim kutusunu kapatmak için Tamam'e tıklayın.