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.
İşlemler örneği, hizmet işlemi davranışını denetlemek için istemci eşgüdümlü bir işlemin kullanımını ve ServiceBehaviorAttribute ve OperationBehaviorAttribute ayarlarını gösterir. Bu örnek, bir hesap makinesi hizmeti uygulayan Başlarken örneğini temel alır, ancak veritabanı tablosunda gerçekleştirilen işlemlerin sunucu günlüğünü ve hesap makinesi işlemleri için durum bilgisi olan bir çalıştırma toplamını korumak üzere genişletilir. Sunucu günlük tablosuna kalıcı yazma işlemleri, istemci eşgüdümlü işleminin sonucuna bağlıdır. İstemci işlemi tamamlanmazsa, Web hizmeti işlemi veritabanındaki güncelleştirmelerin işlenmemesini sağlar.
Not
Bu örnek için kurulum yordamı ve derleme yönergeleri bu makalenin sonunda bulunur.
Hizmetin sözleşmesi, tüm işlemlerin isteklerle birlikte bir işlemin akışını gerektirdiğini tanımlar:
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples",
SessionMode = SessionMode.Required)]
public interface ICalculator
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Add(double n);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Subtract(double n);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Multiply(double n);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Divide(double n);
}
Gelen işlem akışını etkinleştirmek için hizmet, transactionFlow özniteliği olarak ayarlanmış truesistem tarafından sağlanan wsHttpBinding ile yapılandırılır. Bu bağlama birlikte çalışabilir WSAtomicTransactionOctober2004 protokolunu kullanır:
<bindings>
<wsHttpBinding>
<binding name="transactionalBinding" transactionFlow="true" />
</wsHttpBinding>
</bindings>
Hem hizmetle hem de işlemle bir bağlantı başlatdıktan sonra, istemci bu işlem kapsamında birkaç hizmet işlemine erişir ve ardından işlemi tamamlar ve bağlantıyı kapatır:
// Create a client
CalculatorClient client = new CalculatorClient();
// Create a transaction scope with the default isolation level of Serializable
using (TransactionScope tx = new TransactionScope())
{
Console.WriteLine("Starting transaction");
// Call the Add service operation.
double value = 100.00D;
Console.WriteLine(" Adding {0}, running total={1}",
value, client.Add(value));
// Call the Subtract service operation.
value = 45.00D;
Console.WriteLine(" Subtracting {0}, running total={1}",
value, client.Subtract(value));
// Call the Multiply service operation.
value = 9.00D;
Console.WriteLine(" Multiplying by {0}, running total={1}",
value, client.Multiply(value));
// Call the Divide service operation.
value = 15.00D;
Console.WriteLine(" Dividing by {0}, running total={1}",
value, client.Divide(value));
Console.WriteLine(" Completing transaction");
tx.Complete();
}
Console.WriteLine("Transaction committed");
// Closing the client gracefully closes the connection and cleans up resources
client.Close();
Hizmette, hizmet işlemi davranışını etkileyen üç öznitelik vardır ve bunu aşağıdaki yollarla yapar:
ServiceBehaviorAttributeüzerinde:özelliği,
TransactionTimeoutbir işlemin tamamlanması gereken süreyi belirtir. Bu örnekte 30 saniye olarak ayarlanmıştır.özelliği,
TransactionIsolationLevelhizmetin desteklediği yalıtım düzeyini belirtir. Bu, istemcinin yalıtım düzeyiyle eşleşmesi için gereklidir.özelliği,
ReleaseServiceInstanceOnTransactionCompletebir işlem tamamlandığında hizmet örneğinin geri dönüştürülip geri dönüştürülmeyeceğini belirtir. bunu olarakfalseayarlayarak hizmet, işlem isteklerinde aynı hizmet örneğini tutar. Bu, çalışan toplamı korumak için gereklidir. olaraktrueayarlanırsa, tamamlanan her eylemden sonra yeni bir örnek oluşturulur.özelliği,
TransactionAutoCompleteOnSessionCloseoturum kapatıldığında bekleyen işlemlerin tamamlanıp tamamlanmayacağını belirtir. olarak ayarlanarakfalse, tek tek işlemlerin özelliğini OperationBehaviorAttribute.TransactionAutoComplete olarak ayarlamasıtrueveya işlemleri tamamlamak için yöntemine OperationContext.SetTransactionComplete() bir çağrı yapılmasını açıkça gerektirmesi gerekir. Bu örnekte her iki yaklaşım da gösterilmektedir.
ServiceContractAttributeüzerinde:-
SessionModeözelliği, hizmetin uygun istekleri bir mantıksal oturumla ilişkilendirip ilişkilendirmediğini belirtir. Bu hizmet OperationBehaviorAttribute TransactionAutoComplete özelliğinin (Çarpma ve Bölme) olarak ayarlandığı işlemleri içerdiğindenfalsebelirtilmelidirSessionMode.Required. Örneğin, Çarpma işlemi işlemini tamamlamaz ve bunun yerine yöntemini kullanarak tamamlamak için daha sonraki bir Divide çağrısınaSetTransactionCompletedayanır; hizmetin bu işlemlerin aynı oturumda gerçekleştiğini saptayabilmesi gerekir.
-
OperationBehaviorAttributeüzerinde:özelliği,
TransactionScopeRequiredişlemin eylemlerinin bir işlem kapsamında yürütülip yürütülmeyeceğini belirtir. Bu, bu örnekteki tüm işlemler için olarak ayarlanırtrueve istemci işlemini tüm işlemlere akışla aktardığından, eylemler bu istemci işlemi kapsamında gerçekleşir.özelliği,
TransactionAutoCompleteişlenemeyen özel durumlar oluşmazsa yöntemin yürütüldiği işlemin otomatik olarak tamamlanıp tamamlanmayacağını belirtir. Daha önce açıklandığı gibi, bu değer Ekle ve Çıkar işlemleri için, Çarpmatrueve Bölme işlemleri için olarak ayarlanırfalse. Ekle ve Çıkar işlemleri eylemlerini otomatik olarak tamamlar, Böl eylemini yöntemineSetTransactionCompleteyapılan açık bir çağrıyla tamamlar ve Çarpma eylemini tamamlamaz, bunun yerine eylemleri tamamlamak için daha sonra yapılan bölme gibi bir çağrıya dayanır ve gerektirir.
Öznitelikli hizmet uygulaması aşağıdaki gibidir:
[ServiceBehavior(
TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable,
TransactionTimeout = "00:00:30",
ReleaseServiceInstanceOnTransactionComplete = false,
TransactionAutoCompleteOnSessionClose = false)]
public class CalculatorService : ICalculator
{
double runningTotal;
public CalculatorService()
{
Console.WriteLine("Creating new service instance...");
}
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public double Add(double n)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Adding {0} to {1}", n, runningTotal));
runningTotal = runningTotal + n;
return runningTotal;
}
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public double Subtract(double n)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Subtracting {0} from {1}", n, runningTotal));
runningTotal = runningTotal - n;
return runningTotal;
}
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = false)]
public double Multiply(double n)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Multiplying {0} by {1}", runningTotal, n));
runningTotal = runningTotal * n;
return runningTotal;
}
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = false)]
public double Divide(double n)
{
RecordToLog(String.Format(CultureInfo.CurrentCulture, "Dividing {0} by {1}", runningTotal, n));
runningTotal = runningTotal / n;
OperationContext.Current.SetTransactionComplete();
return runningTotal;
}
// Logging method omitted for brevity
}
Ö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
Performing calculations...
Adding 100, running total=100
Subtracting 45, running total=55
Multiplying by 9, running total=495
Dividing by 15, running total=33
Completing transaction
Transaction committed
Press <ENTER> to terminate client.
Hizmet işlemi isteklerinin günlüğe kaydedilmesi hizmetin konsol penceresinde görüntülenir. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.
Press <ENTER> to terminate service.
Creating new service instance...
Writing row 1 to database: Adding 100 to 0
Writing row 2 to database: Subtracting 45 from 100
Writing row 3 to database: Multiplying 55 by 9
Writing row 4 to database: Dividing 495 by 15
Hizmetin, hesaplamaların çalışan toplamını tutmanın yanı sıra örneklerin oluşturulmasını (bu örnek için bir örnek) rapor ettiğini ve işlem isteklerini bir veritabanına günlüğe kaydeddiğini unutmayın. tüm istekler istemcinin işlemini akıttığı için, bu işlemin tamamlanmaması tüm veritabanı işlemlerinin geri alınmasına neden olur. Bu, çeşitli yollarla gösterilebilir:
İstemcinin () çağrısına
tx.Completeaçıklama ekleyin ve yeniden çalıştırın; bu, istemcinin işlemini tamamlamadan işlem kapsamından çıkmasıyla sonuçlanıyor.Hizmeti bölme işlemine yapılan çağrıyı açıklama satırı yapma- Bu sonuçlar Çarpma işlemi tarafından başlatılan eylemin tamamlanmasını engeller ve böylece istemcinin işlemi de tamamlanamadı.
İstemcinin işlem kapsamında herhangi bir yere işlenmeyen bir özel durum oluşturun; bu da benzer şekilde istemcinin işlemini tamamlamasını engeller.
Bunlardan herhangi birinin sonucu, bu kapsamda gerçekleştirilen işlemlerin hiçbirinin işlenmemesi ve veritabanında kalıcı olan satır sayısının artmamasıdır.
Not
Derleme işleminin bir parçası olarak veritabanı dosyası bin klasörüne kopyalanır. Visual Studio projesine dahil edilen dosya yerine günlükte kalıcı olan satırları gözlemlemek için veritabanı dosyasının bu kopyasına bakmanız gerekir.
Örneği ayarlamak, derlemek ve çalıştırmak için
SQL Server 2005 Express Sürüm veya SQL Server 2005 yüklediğinizden emin olun. Hizmetin App.config dosyasında veritabanı
connectionStringayarlanabilir veya appSettings değeriusingSqlolarak ayarlanarak veritabanı etkileşimlerifalsedevre dışı bırakılabilir.Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.
Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.
Örneği makineler arasında çalıştırırsanız, ağ işlem akışını etkinleştirmek için Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) yapılandırmanız ve Windows Communication Foundation (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ğin makineler arasında çalıştırılmasını destekleyecek şekilde yapılandırmak için
Hizmet makinesinde MSDTC'yi gelen ağ işlemlerine izin verecek şekilde yapılandırın.
Başlat menüsünden Denetim Masası,Yönetim Araçları'na ve ardından Bileşen Hizmetleri'ne gidin.
Bilgisayarım'a sağ tıklayın ve Özellikler'i seçin.
MSDTC sekmesinde Güvenlik Yapılandırması'na tıklayın.
Ağ DTC Erişimini ve Gelenlere İzin Ver'i denetleyin.
MS DTC hizmetini yeniden başlatmak için Evet'e ve ardından Tamam'a tıklayın.
Tamam’a tıklayarak iletişim kutusunu kapatın.
Hizmet makinesinde ve istemci makinede, Windows Güvenlik Duvarı'nı Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) hariç uygulamalar listesine içerecek şekilde yapılandırın:
Denetim Masası'den Windows Güvenlik Duvarı uygulamasını çalıştırın.
Özel Durumlar sekmesinde Program Ekle'ye tıklayın.
C:\WINDOWS\System32 klasörüne gidin.
Msdtc.exe seçin ve Aç'a tıklayın.
Program Ekle iletişim kutusunu kapatmak için Tamam'a tıklayın ve Windows Güvenlik Duvarı'nı kapatmak için yeniden Tamam'a tıklayın.
İstemci makinesinde MSDTC'yi giden ağ işlemlerine izin verecek şekilde yapılandırın:
Başlat menüsünden Denetim Masası,Yönetim Araçları'na ve ardından Bileşen Hizmetleri'ne gidin.
Bilgisayarım'a sağ tıklayın ve Özellikler'i seçin.
MSDTC sekmesinde Güvenlik Yapılandırması'na tıklayın.
Ağ DTC Erişimi'ni ve Gidene İzin Ver'i denetleyin.
MS DTC hizmetini yeniden başlatmak için Evet'e ve ardından Tamam'a tıklayın.
Tamam’a tıklayarak iletişim kutusunu kapatın.