Oturumları Kullanma
Windows Communication Foundation (WCF) uygulamalarında oturum, bir grup iletiyi bir konuşmayla ilişkilendirmektedir. WCF oturumları, ASP.NET uygulamalarda kullanılabilen oturum nesnesinden farklıdır, farklı davranışları destekler ve farklı şekillerde denetlenilir. Bu konu başlığında, oturumların WCF uygulamalarında etkinleştirdiği özellikler ve bunların nasıl kullanılacağı açıklanmaktadır.
Windows Communication Foundation Uygulamalarında Oturumlar
Bir hizmet sözleşmesi bir oturum gerektirdiğini belirttiğinde, bu sözleşme tüm çağrıların (yani çağrıları destekleyen temel ileti alışverişlerinin) aynı konuşmanın bir parçası olması gerektiğini belirtir. Bir sözleşme oturumlara izin verdiği halde oturum gerektirmediğini belirtiyorsa, istemciler bağlanabilir ve oturum kurabilir veya oturum kuramayabilir. Oturum sona erer ve aynı kanal üzerinden bir ileti gönderilirse bir özel durum oluşturulur.
WCF oturumları aşağıdaki ana kavramsal özelliklere sahiptir:
Bunlar, çağıran uygulama (WCF istemcisi) tarafından açıkça başlatılır ve 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. Farklı bağıntı türleri mümkündü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.
Bu konu başlığı altında aşağıdakiler açıklanmaktadır:
Hizmet modeli katmanında oturum tabanlı bağlamalar kullanılırken varsayılan yürütme davranışı.
WCF oturum tabanlı, sistem tarafından sağlanan bağlamaların sağladığı özellik türleri.
Oturum gereksinimini bildiren bir sözleşme oluşturma.
Oturumun oluşturulmasını ve sonlandırılmasını ve oturumun hizmet örneğiyle ilişkisini anlama ve denetleme.
Oturumları Kullanarak Varsayılan Yürütme Davranışı
Oturumu başlatmaya çalışan bağlamaya oturum tabanlı bağlama adı verilir. Hizmet sözleşmeleri, hizmet sözleşmesi arabirimindeki (veya sınıfındaki) özelliği numaralandırma değerlerinden birine System.ServiceModel.SessionMode ayarlayarak ServiceContractAttribute.SessionMode oturum tabanlı bağlamalara ihtiyaç duymalarını, izin vermelerini veya reddetmelerini belirtir. Varsayılan olarak, bu özelliğin değeri olur Allowed. Bu, bir istemci wcf hizmeti uygulamasıyla oturum tabanlı bağlama kullanırsa hizmetin sağlanan oturumu oluşturup kullandığı anlamına gelir.
WCF hizmeti bir istemci oturumunu kabul ettiğinde, aşağıdaki özellikler varsayılan olarak etkinleştirilir:
WCF istemci nesnesi arasındaki tüm çağrılar aynı hizmet örneği tarafından işlenir.
Farklı oturum tabanlı bağlamalar ek özellikler sağlar.
Sistem Tarafından Sağlanan Oturum Türleri
Oturum tabanlı bağlama, bir hizmet örneğinin belirli bir oturumla varsayılan ilişkilendirmesini destekler. Ancak farklı oturum tabanlı bağlamalar, daha önce açıklanan oturum tabanlı kapsayıcı denetimini etkinleştirmenin yanı sıra farklı özellikleri destekler.
WCF aşağıdaki oturum tabanlı uygulama davranışı türlerini sağlar:
, System.ServiceModel.Channels.SecurityBindingElement iletişimin her iki ucunun da belirli bir güvenli konuşma üzerinde anlaşmaya vardığı güvenlik tabanlı oturumları destekler. Daha fazla bilgi için bkz . Hizmetlerin Güvenliğini Sağlama. Örneğin, System.ServiceModel.WSHttpBinding hem güvenlik oturumları hem de güvenilir oturumlar için destek içeren bağlama, varsayılan olarak yalnızca iletileri şifreleyen ve dijital olarak imzalayan güvenli bir oturum kullanır.
Bağlama, System.ServiceModel.NetTcpBinding tüm iletilerin yuva düzeyinde bağlantıyla ilişkilendirildiğinden emin olmak için TCP/IP tabanlı oturumları destekler.
System.ServiceModel.Channels.ReliableSessionBindingElement WS-ReliableMessaging belirtimini uygulayan öğesi, iletilerin sırasıyla ve tam olarak bir kez teslim edilecek şekilde yapılandırılabildiği güvenilir oturumlar için destek sağlar ve konuşma sırasında iletiler birden çok düğüm arasında hareket ettiğinde bile iletilerin alındığından emin olur. Daha fazla bilgi için bkz . Güvenilir Oturumlar.
Bağlama MSMQ System.ServiceModel.NetMsmqBinding veri birimi oturumları sağlar. Daha fazla bilgi için bkz . WCF'de kuyruklar.
Özelliğin SessionMode ayarlanması, sözleşmenin gerektirdiği oturum türünü belirtmez, yalnızca bir oturum gerektirir.
Oturum Gerektiren Bir Sözleşme Oluşturma
Oturum gerektiren bir sözleşme oluşturmak, hizmet sözleşmesinin bildirmiş olduğu işlem grubunun tümünün aynı oturum içinde yürütülmesi ve iletilerin sırayla teslim edilmesi gerektiğini belirtir. Bir hizmet sözleşmesinin gerektirdiği oturum desteği düzeyini onaylamanız için, hizmet sözleşmesi arabiriminizdeki veya sınıfınızdaki özelliği sabit listesi değerine ayarlayarak ServiceContractAttribute.SessionMode sözleşmenin System.ServiceModel.SessionMode olup olmadığını belirtin:
Oturum gerektirir.
İstemcinin oturum oluşturmasına izin verir.
Oturumu yasaklar.
Ancak özelliğin SessionMode ayarlanması, sözleşmenin gerektirdiği oturum tabanlı davranışın türünü belirtmez. WCF'ye, hizmet için yapılandırılan bağlamanın (iletişim kanalını oluşturan) hizmet uygulanırken oturum oluşturamadığını veya kuramadığını onaylamasını ister. Bağlama, seçtiği her tür oturum tabanlı davranışla (güvenlik, aktarım, güvenilir veya bazı birleşimler) bu gereksinimi karşılayabilir. Tam davranış, seçilen değere System.ServiceModel.SessionMode bağlıdır. Hizmetin yapılandırılmış bağlaması değerine SessionModeuymuyorsa, bir özel durum oluşturulur. Bağlamalar ve oluşturdukları ve destek oturumlarını destekleyen kanalların oturum tabanlı olduğu söylenir.
Aşağıdaki hizmet sözleşmesi içindeki ICalculatorSession
tüm işlemlerin bir oturum içinde değiş tokuş edilmesi gerektiğini belirtir. İşlemlerin hiçbiri çağırana yöntemi dışında bir değer döndürmez Equals
. Ancak, Equals
yöntemi hiçbir parametre almaz ve bu nedenle, verilerin diğer işlemlere zaten geçirilmiş olduğu bir oturum içinde yalnızca sıfır olmayan bir değer döndürebilir. Bu sözleşmenin düzgün çalışması için bir oturum gerekir. Belirli bir istemciyle ilişkilendirilmiş bir oturum olmadan, hizmet örneğinin bu istemcinin önceki hangi verileri gönderdiğini bilmesi mümkün değildir.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
[OperationContract]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface
Bir hizmet oturuma izin veriyorsa, istemci bir oturum başlatırsa bir oturum oluşturulur ve kullanılır; aksi takdirde oturum oluşturulmaz.
Oturumlar ve Hizmet Örnekleri
WCF'de varsayılan depolama davranışını kullanırsanız, WCF istemci nesnesi arasındaki tüm çağrılar aynı hizmet örneği tarafından işlenir. Bu nedenle, uygulama düzeyinde bir oturumu yerel çağrı davranışına benzer bir uygulama davranışını etkinleştirme olarak düşünebilirsiniz. Örneğin, yerel bir nesne oluşturduğunuzda:
Oluşturucu çağrılır.
WCF istemci nesnesi başvurusuna yapılan sonraki tüm çağrılar aynı nesne örneği tarafından işlenir.
Nesne başvurusu yok edildiğinde bir yıkıcı çağrılır.
Oturumlar, varsayılan hizmet örneği davranışı kullanıldığı sürece istemciler ve hizmetler arasında benzer bir davranış sağlar. Bir hizmet sözleşmesi oturum gerektiriyorsa veya destekliyorsa, ve IsTerminating özellikleri ayarlanarak IsInitiating bir veya daha fazla sözleşme işlemi oturumu başlatıyor veya sonlandırıyor olarak işaretlenebilir.
Başlatma işlemleri , yeni oturumun ilk işlemi olarak çağrılmalıdır. Başlatılmayan işlemler ancak en az bir başlatma işlemi çağrıldıktan sonra çağrılabilir. Bu nedenle, hizmet örneğinin başına uygun istemcilerden giriş almak üzere tasarlanmış işlemleri başlatarak hizmetiniz için bir tür oturum oluşturucu oluşturabilirsiniz. (Durum, hizmet nesnesiyle değil oturumla ilişkilendirilir.)
Buna karşılık sonlandırıcı işlemler, var olan bir oturumda son ileti olarak çağrılmalıdır. Varsayılan durumda WCF, hizmetin ilişkilendirildiği oturum kapatıldıktan sonra hizmet nesnesini ve bağlamını geri dönüştürür. Bu nedenle, hizmet örneğinin sonuna uygun bir işlev gerçekleştirmek için tasarlanmış sonlandırıcı işlemleri bildirerek bir tür yıkıcı oluşturabilirsiniz.
Not
Varsayılan davranış, yerel oluşturuculara ve yıkıcılara benzer olsa da, yalnızca bir benzerliktir. Herhangi bir WCF hizmeti işlemi başlatan veya sonlandıran bir işlem ya da aynı anda her ikisi de olabilir. Buna ek olarak, varsayılan durumda başlatma işlemleri herhangi bir sırayla istediğiniz sayıda çağrılabilir; hizmet örneğinin ömrünü açıkça denetlemediğiniz sürece (nesneyi düzenleyerek System.ServiceModel.InstanceContext ) oturum oluşturulduktan ve bir örnekle ilişkilendirildikten sonra ek oturum oluşturulmaz. Son olarak, durum hizmet nesnesiyle değil oturumla ilişkilendirilir.
Örneğin, önceki örnekte kullanılan sözleşme, ICalculatorSession
WCF istemci nesnesinin işlemi başka bir işlemden önce çağırmasını Clear
ve bu WCF istemci nesnesine sahip oturumun işlemi çağırdığında Equals
sonlandırılması gerektiğini gerektirir. Aşağıdaki kod örneği, bu gereksinimleri uygulayan bir sözleşmeyi gösterir. Clear
bir oturumu başlatmak için önce çağrılmalıdır ve bu oturum çağrıldığında Equals
sona erer.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
Sub Clear()
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
Sub DivideBy(ByVal n As Double)
<OperationContract(IsInitiating:=False, IsTerminating:=True)> _
Function Equal() As Double
End Interface
Hizmetler istemcilerle oturum başlatmaz. WCF istemci uygulamalarında, oturum tabanlı kanalın ömrü ile oturumun ömrü arasında doğrudan bir ilişki vardır. Bu nedenle, istemciler yeni oturum tabanlı kanallar oluşturarak yeni oturumlar oluşturur ve oturum tabanlı kanalları düzgün bir şekilde kapatarak mevcut oturumları yok eder. İstemci, aşağıdakilerden birini çağırarak bir hizmet uç noktasıyla oturum başlatır:
ICommunicationObject.Open çağrısı tarafından döndürülen kanalda ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.OpenServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından oluşturulan WCF istemci nesnesinde.
WCF istemci nesnesinin her iki türünde de başlatma işlemi (varsayılan olarak tüm işlemler başlatılıyor). İlk işlem çağrıldığında WCF istemci nesnesi kanalı otomatik olarak açar ve bir oturum başlatır.
Genellikle bir istemci aşağıdakilerden birini çağırarak hizmet uç noktasıyla oturumu sonlandırır:
ICommunicationObject.Close çağrısı tarafından döndürülen kanalda ChannelFactory<TChannel>.CreateChannel.
ClientBase<TChannel>.Close Svcutil.exe tarafından oluşturulan WCF istemci nesnesinde.
WCF istemci nesnesinin her iki türünde de sonlandırma işlemi (varsayılan olarak hiçbir işlem sonlandırılmamalıdır; sözleşme açıkça bir sonlandırma işlemi belirtmelidir). İlk işlem çağrıldığında WCF istemci nesnesi kanalı otomatik olarak açar ve bir oturum başlatır.
Örnekler için bkz . Nasıl yapılır: Oturum Gerektiren Bir Hizmet Oluşturma'nın yanı sıra Varsayılan Hizmet Davranışı ve Depolama örnekleri.
İstemciler ve oturumlar hakkında daha fazla bilgi için bkz . WCF İstemcisi Kullanarak Hizmetlere Erişme.
Oturumlar InstanceContext Ayarlar ile Etkileşime Geçin
Bir sözleşmedeki SessionMode numaralandırma ile kanallar ve belirli hizmet nesneleri arasındaki ilişkiyi ServiceBehaviorAttribute.InstanceContextMode denetleyen özellik arasında bir etkileşim vardır. Daha fazla bilgi için bkz . Oturumlar, Tutarsızlık ve Eşzamanlılık.
InstanceContext Nesnelerini Paylaşma
Ayrıca, bu ilişkilendirmeyi kendiniz gerçekleştirerek hangi oturum tabanlı kanalın veya çağrının hangi InstanceContext nesneyle ilişkilendirildiğini de denetleyebilirsiniz.
Oturumlar ve Akış
Aktarabileceğiniz çok fazla veri olduğunda, WCF'deki akış aktarım modu, iletileri bellekte tamamen arabelleğe alma ve işlemenin varsayılan davranışına uygun bir alternatiftir. Oturum tabanlı bağlama ile çağrı akışı yaparken beklenmeyen davranışlarla karşılaşabilirsiniz. Tüm akış çağrıları, kullanılan bağlama oturumları kullanacak şekilde yapılandırılmış olsa bile oturumları desteklemeyen tek bir kanal (veri birimi kanalı) üzerinden yapılır. Birden çok istemci oturum tabanlı bağlama üzerinden aynı hizmet nesnesine akış çağrıları yaparsa ve hizmet nesnesinin eşzamanlılık modu tek olarak ayarlanırsa ve örnek bağlam modu olarak ayarlanırsa PerSession
, tüm çağrıların veri birimi kanalından geçmesi gerekir ve bu nedenle aynı anda yalnızca bir çağrı işlenir. Bundan sonra bir veya daha fazla istemci zaman aşımına uğradı. Hizmet nesnesinin InstanceContextMode
PerCall
öğesini veya Eşzamanlılık'ı birden çok olarak ayarlayarak bu soruna geçici bir çözüm bulabilirsiniz.
Not
Kullanılabilir yalnızca bir "oturum" olduğundan MaxConcurrentSessions bu durumda hiçbir etkiye sahip değildir.