Aracılığıyla paylaş


Oturumlar, Örnekleme ve Eşzamanlılık

Oturum, iki uç nokta arasında gönderilen tüm iletilerin bağıntısıdır. Örnekleme, kullanıcı tanımlı hizmet nesnelerinin ve bunlarla ilgili InstanceContext nesnelerinin yaşam ömrünü denetlemeyi ifade eder. Aynı anda birden fazla iş parçacığını çalıştırabilme yeteneğine verilen terim olan InstanceContext, belirli bir ortamda iş parçacığı sayısının denetimini ifade eder.

Bu konu başlığında bu ayarlar, bunların nasıl kullanılacağı ve aralarındaki çeşitli etkileşimler açıklanmaktadır.

Oturumlar

Bir hizmet sözleşmesi özelliği olarak ServiceContractAttribute.SessionModeSessionMode.Requiredayarladığında, bu sözleşme tüm çağrıların (yani çağrıları destekleyen temel ileti alışverişlerinin) aynı konuşmanın parçası olması gerektiğini söyler. Bir sözleşme oturumlara izin verdiği halde oturum gerektirmediğini belirtiyorsa, istemciler bağlanabilir ve oturum oluşturabilir veya kuramayabilir. Oturum sona erer ve aynı oturum tabanlı kanal üzerinden bir ileti gönderilirse bir özel durum oluşturulur.

WCF oturumları aşağıdaki ana kavramsal özelliklere sahiptir:

  • Bunlar açıkça başlatılır ve çağıran uygulama tarafından sonlandırılır.

  • Oturum sırasında teslim edilen iletiler, alındıkları sırayla işlenir.

  • Oturumlar, bir ileti grubunu bir konuşmayla ilişkilendirer. Bu bağıntının anlamı bir soyutlamadır. Örneğin, bir oturum tabanlı kanal iletileri paylaşılan ağ bağlantısına göre ilişkilendirirken, başka bir oturum tabanlı kanal iletileri ileti gövdesindeki paylaşılan etikete göre ilişkilendirebilir. Oturumdan türetilebilen özellikler bağıntının doğasına bağlıdır.

  • WCF oturumuyla ilişkilendirilmiş genel veri deposu yoktur.

ASP.NET uygulamalarındaki System.Web.SessionState.HttpSessionState sınıfı ve sağladığı işlevselliği biliyorsanız, bu tür oturumlarla WCF oturumları arasında aşağıdaki farkları fark edebilirsiniz:

  • ASP.NET oturumları her zaman sunucu tarafından başlatılır.

  • ASP.NET oturumları örtük olarak sıralanmamıştır.

  • ASP.NET oturumları, istekler arasında genel bir veri depolama mekanizması sağlar.

İstemci uygulamaları ve hizmet uygulamaları oturumlarla farklı şekillerde etkileşim kurar. İstemci uygulamaları oturumları başlatır ve ardından oturum içinde gönderilen iletileri alır ve işler. Hizmet uygulamaları, ek davranış eklemek için oturumları genişletilebilirlik noktası olarak kullanabilir. Bu, doğrudan ile InstanceContext çalışarak veya özel bir örnek bağlam sağlayıcısı uygulayarak yapılır.

Örnekleme

Instancing davranışı (özellik kullanılarak ServiceBehaviorAttribute.InstanceContextMode ayarlanır), gelen iletilere yanıt olarak öğenin nasıl oluşturulduğunu InstanceContext kontrol eder. Varsayılan olarak, her InstanceContext, bir kullanıcı tarafından tanımlanmış hizmet nesnesiyle ilişkilendirilir; bu nedenle, varsayılan durumda InstanceContextMode özelliğini ayarlamak, kullanıcı tanımlı hizmet nesnelerinin örneklendirilmesini de kontrol eder. Numaralandırma, InstanceContextMode instancing modlarını tanımlar.

Aşağıdaki örnekleme modları mevcuttur:

  • PerCall: Her istemci isteği için yeni InstanceContext bir (ve dolayısıyla hizmet nesnesi) oluşturulur.

  • PerSession: Her yeni istemci oturumu için yeni InstanceContext bir (ve dolayısıyla hizmet nesnesi) oluşturulur ve bu oturumun ömrü boyunca korunur (bu, oturumları destekleyen bir bağlama gerektirir).

  • Single: Tek InstanceContext bir (ve dolayısıyla hizmet nesnesi) uygulamanın ömrü boyunca tüm istemci isteklerini işler.

Varsayılan InstanceContextMode değerinin PerSession ile birlikte bir hizmet sınıfında açıkça ayarlanmış olduğunu gösteren aşağıdaki kod örneği.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorInstance
{
    ...  
}  

ServiceBehaviorAttribute.InstanceContextMode özelliği InstanceContext öğesinin ne sıklıkta yayımlandığını kontrol ederken, OperationBehaviorAttribute.ReleaseInstanceMode ve ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete özellikleri hizmet nesnesinin ne zaman serbest bırakılacağını kontrol eder.

Well-Known Singleton Services

Tek örnekli hizmet nesnelerindeki bir çeşitleme bazen yararlıdır: Bir hizmet nesnesini kendiniz oluşturabilir ve bu nesneyi kullanarak hizmet konasını oluşturabilirsiniz. Bunu yapmak için, ServiceBehaviorAttribute.InstanceContextMode özelliğini Single olarak ayarlamanız gerekir, aksi takdirde hizmet konağı açıldığında bir özel durum oluşturulur.

Böyle bir hizmet oluşturmak için oluşturucuyu ServiceHost(Object, Uri[]) kullanın. Özel System.ServiceModel.Dispatcher.IInstanceContextInitializer uygulamak yerine, bir singleton hizmeti tarafından kullanılmak üzere belirli bir nesne örneği sağlamak istediğinizde bir alternatif sunar. Hizmet uygulama türünüzü oluşturmak zor olduğunda (örneğin, parametresiz bir ortak oluşturucu uygulamazsa) bu aşırı yüklemeyi kullanabilirsiniz.

Bir nesne bu oluşturucuya sağlandığında, Windows Communication Foundation (WCF) örnekleme davranışıyla ilgili bazı özelliklerin farklı çalıştığını unutmayın. Örneğin, bir singleton nesne örneği sağlandığında InstanceContext.ReleaseServiceInstance çağrısının hiçbir etkisi yoktur. Benzer şekilde, diğer tüm örnek yayın mekanizmaları yoksayılır. ServiceHost her zaman OperationBehaviorAttribute.ReleaseInstanceMode özelliği tüm işlemler için ReleaseInstanceMode.None olarak ayarlanmış gibi davranır.

InstanceContext Nesnelerini Paylaşma

Ayrıca, bu ilişkilendirmeyi kendiniz gerçekleştirerek hangi oturumlu kanalın veya çağrının hangi InstanceContext nesneyle ilişkilendirildiğini de denetleyebilirsiniz.

Eşzamanlılık

Eşzamanlılık, bir InstanceContext'de bir anda etkin olan iş parçacığı sayısının denetimidir. Bu, sabit liste ServiceBehaviorAttribute.ConcurrencyMode ile kullanılarak ConcurrencyMode kontrol edilir.

Aşağıdaki üç eşzamanlılık modu kullanılabilir:

  • Single: Her örnek bağlamında aynı anda en fazla bir iş parçacığının mesajları işlemesine izin verilir. Aynı örnek bağlamını kullanmak isteyen diğer iş parçacıkları, özgün iş parçacığı örnek bağlamından çıkana kadar engellemelidir.

  • Multiple: Her hizmet örneğinde iletileri eşzamanlı olarak işleyen birden çok iş parçacığı olabilir. Bu eşzamanlılık modunu kullanmak için hizmet uygulamasının iş parçacığı güvenliğini sağlaması gerekir.

  • Reentrant: Her hizmet örneği bir kerede bir iletiyi işler, ancak yeniden girişli işlem çağrılarını kabul eder. Hizmet yalnızca bir WCF istemci nesnesi üzerinden çağrı yaparken bu çağrıları kabul eder.

Uyarı

Birden fazla iş parçacığını güvenli bir şekilde kullanan kodu anlamak ve geliştirmek, başarıyla yazmak zor olabilir. Multiple veya Reentrant değerlerini kullanmadan önce, hizmetinizin bu modlar için düzgün tasarlandığından emin olun. Daha fazla bilgi için bkz. ConcurrencyMode.

Eşzamanlılık kullanımı, örnekleme moduyla ilgilidir. PerCall örneklemede, eşzamanlılık önem arz etmez, çünkü her mesaj yeni bir InstanceContext tarafından işlendiği için InstanceContext içerisinde hiçbir zaman birden fazla iş parçacığı etkin olmaz.

Aşağıdaki kod örneği ConcurrencyMode özelliğinin Multiple olarak ayarlanmasını göstermektedir.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
    ...  
}  

Oturumlar InstanceContext Ayarlarıyla Etkileşime Geçer

Oturumlar ve InstanceContext, bir sözleşmedeki SessionMode numaralandırmanın ve hizmet uygulamasındaki kanallar ile belirli hizmet nesneleri arasındaki ilişkiyi denetleyen ServiceBehaviorAttribute.InstanceContextMode özelliğinin birleşimi doğrultusunda etkileşim kurar.

Aşağıdaki tabloda, bir hizmetin ServiceContractAttribute.SessionMode ve ServiceBehaviorAttribute.InstanceContextMode özelliği değerlerinin birleşimine bağlı olarak, gelen bir kanalın oturumları destekleyip desteklemediği sonucu gösterilmektedir.

InstanceContextMode değeri Required Allowed NotAllowed
PerCall - Oturumlu kanal ile davranış: Bir oturum ve InstanceContext her çağrı için.
- Oturumsuz kanal ile davranış: Bir istisna fırlatılır.
- Oturumlu kanal ile davranış: Bir oturum ve InstanceContext her çağrı için.
- Oturumsuz kanal ile davranış: Her çağrı için bir InstanceContext .
- Oturum açan kanalda davranış: Bir özel durum oluşturulur.
- Oturumsuz kanal ile davranış: Her çağrı için bir InstanceContext .
PerSession - Oturumlu kanal ile davranış: Bir oturum ve InstanceContext her kanal için.
- Oturumsuz kanal ile davranış: Bir istisna fırlatılır.
- Oturumlu kanal ile davranış: Bir oturum ve InstanceContext her kanal için.
- Oturumsuz kanal ile davranış: Her çağrı için bir InstanceContext .
- Oturum açan kanalda davranış: Bir özel durum oluşturulur.
- Oturumsuz kanal ile davranış: Her çağrı için bir InstanceContext .
Bekâr - Oturumlu kanal ile davranış: Bir oturum ve tüm çağrılar için bir tane InstanceContext .
- Oturumsuz kanal ile davranış: Bir istisna fırlatılır.
- Oturumlu kanal ile davranış: Bir oturum ve InstanceContext oluşturulan veya kullanıcı tarafından belirtilen tekil için.
- Oturumsuz kanal ile ilgili davranış: Oluşturulan veya kullanıcı tarafından belirtilen tekil için bir InstanceContext .
- Oturum açan kanalda davranış: Bir özel durum oluşturulur.
- Oturumsuz kanal ile davranış: Oluşturulan her bir tekil için veya kullanıcı tarafından belirtilen tekil için bir InstanceContext.

Ayrıca bakınız