Share via


Oturumlar, Örnek Oluşturma ve Eşzamanlılık

Oturum, iki uç nokta arasında gönderilen tüm iletilerin bağıntısıdır. Uygulama, kullanıcı tanımlı hizmet nesnelerinin ve bunların ilgili InstanceContext nesnelerinin yaşam ömrünü denetlemeyi ifade eder. Eşzamanlılık , bir içinde aynı anda yürütülen InstanceContext iş parçacığı sayısının denetimine verilen terimdir.

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.

Örnek Oluşturma

Instancing davranışı (özelliği kullanılarak ServiceBehaviorAttribute.InstanceContextMode ayarlanır), gelen iletilere yanıt olarak öğesinin nasıl oluşturulduğunu InstanceContext denetler. Varsayılan olarak, her InstanceContext biri kullanıcı tanımlı bir hizmet nesnesiyle ilişkilendirilir, bu nedenle (varsayılan durumda) özelliği ayarlamak InstanceContextMode , kullanıcı tanımlı hizmet nesnelerinin temsini de denetler. Numaralandırma, InstanceContextMode instancing modlarını tanımlar.

Aşağıdaki boyutlandırma modları kullanılabilir:

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

Aşağıdaki kod örneği, PerSession bir hizmet sınıfında açıkça ayarlanan varsayılan InstanceContextMode değeri gösterir.

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

Özelliği, öğesinin ServiceBehaviorAttribute.InstanceContextMode ne sıklıkta InstanceContext yayımlanıp yayımlanmaycasını denetlerken, OperationBehaviorAttribute.ReleaseInstanceMode ve ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete özellikleri de hizmet nesnesinin ne zaman serbest bırakıldığına denetler.

İyi Bilinen Singleton Hizmetleri

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, özelliğini Single de olarak ayarlamanız ServiceBehaviorAttribute.InstanceContextMode gerekir veya 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. Tek bir hizmet tarafından kullanılmak üzere belirli bir nesne örneği sağlamak istediğinizde özel System.ServiceModel.Dispatcher.IInstanceContextInitializer uygulama için bir alternatif sağlar. 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.

Bu oluşturucuya bir nesne sağlandığında, Windows Communication Foundation (WCF) ile ilgili bazı özelliklerin farklı çalıştığını unutmayın. Örneğin, tek bir nesne örneği sağlandığında çağrının InstanceContext.ReleaseServiceInstance hiçbir etkisi olmaz. Benzer şekilde, diğer tüm örnek yayın mekanizmaları yoksayılır. her ServiceHost zaman özelliği tüm işlemler için olarak ayarlanmış ReleaseInstanceMode.None gibi OperationBehaviorAttribute.ReleaseInstanceMode 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 kerede bir içinde InstanceContext etkin olan iş parçacığı sayısının denetimidir. Bu, ile sabit listesi kullanılarak ServiceBehaviorAttribute.ConcurrencyModeConcurrencyMode denetlenilir.

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

  • Single: Her örnek bağlamının bir kerede örnek bağlamında en fazla bir iş parçacığı işleme iletisine sahip olmasına 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 olması gerekir.

  • Reentrant: Her hizmet örneği bir kerede bir iletiyi işler, ancak yeniden katılımcı 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.

Not

Birden fazla iş parçacığını güvenli bir şekilde kullanan kodu anlamak ve geliştirmek, başarıyla yazmak zor olabilir. veya Reentrant değerlerini kullanmadan Multiple ö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ı, tutarsızlık moduyla ilgilidir. Her PerCall ileti yeni InstanceContext bir ileti tarafından işlendiğinden ve bu nedenle içinde hiçbir zaman birden fazla iş parçacığı etkin InstanceContextolmadığından, tutarsızlık uygun değildir.

Aşağıdaki kod örneğinde özelliği Multipleolarak ConcurrencyMode ayarlanması gösterilmektedir.

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

Oturumlar InstanceContext Ayarlar ile Etkileşime Geçin

Oturumlar ve InstanceContext etkileşim, bir sözleşmedeki sabit listesi değerinin SessionMode ve kanallar ile ServiceBehaviorAttribute.InstanceContextMode belirli hizmet nesneleri arasındaki ilişkiyi denetleyen hizmet uygulamasındaki özelliğin birleşimine bağlı olarak etkileşim kurar.

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

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 özel durum oluşturulur.
- 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 özel durum oluşturulur.
- 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 .
Tekli - Oturumlu kanal ile davranış: Bir oturum ve tüm çağrılar için bir tane InstanceContext .
- Oturumsuz kanal ile davranış: Bir özel durum oluşturulur.
- Oturumlu kanal ile davranış: Bir oturum ve InstanceContext oluşturulan veya kullanıcı tarafından belirtilen tekil için.
- Oturumsuz kanal ile 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ış: InstanceContext Oluşturulan her bir tekil için veya kullanıcı tarafından belirtilen tekil için bir.

Ayrıca bkz.