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:

  1. WCF istemci nesnesi arasındaki tüm çağrılar aynı hizmet örneği tarafından işlenir.

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

Ö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:

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 InstanceContextModePerCall öğ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.

Ayrıca bkz.