Aracılığıyla paylaş


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 erdiğinde ve aynı kanal üzerinden bir ileti gönderildiğinde 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.

Oturum Kullanarak Varsayılan Çalıştırma 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 ServiceContractAttribute.SessionMode ayarlayarak System.ServiceModel.SessionMode oturum tabanlı bağlamalara ihtiyaç duymalarını, izin vermelerini veya reddetmelerini belirtir. Varsayılan olarak, bu özelliğin değeri Allowed olur. Bu, bir istemci WCF hizmeti uygulamasıyla oturum tabanlı bir bağlama kullanırsa, hizmetin sağlanan oturumu kurup kullanacağı 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.

System-Provided 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 belirlemek için, hizmet sözleşmesi arayüzünüzdeki veya sınıfınızdaki ServiceContractAttribute.SessionMode özelliğini System.ServiceModel.SessionMode sabit listesi değerine ayarlayarak sözleşmenin şu durumlardan hangisini içerdiğini 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 çalışma zamanında hizmet için yapılandırılan bağlamanın (iletişim kanalını oluşturan) hizmet uygularken bir oturum oluşturamadığını veya kuramadığını onaylamasını ister. Bağlama, belirlediği her tür oturum tabanlı davranışla - güvenlik, aktarım, güvenilirlik veya bunların bazı birleşimleri - bu gereksinimi karşılayabilir. Tam davranış, seçilen değere System.ServiceModel.SessionMode bağlıdır. Hizmetin yapılandırılmış bağlaması SessionMode değerine uymuyorsa, bir istisna fırlatılır. Bağlamalar ve oturumları destekleyen kanalların oluşturduğu yapılar, oturum tabanlı olarak kabul edilir.

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. Equals yöntemi haricinde işlemlerin hiçbiri çağırana bir değer döndürmez. 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 gerektiği gibi ç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 referansı 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, IsInitiating ve IsTerminating özellikleri ayarlanarak 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 gerçekleştikten sonra çağrılabilir. Bu nedenle, hizmet örneğinin başına uygun istemcilerden giriş almak üzere tasarlanmış oturum başlatma işlemlerini ilan ederek hizmetiniz için bir tür oturum yapıcı 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şlevi gerçekleştirmek üzere tasarlanmış sona erdirici işlemleri bildirerek bir tür destrüktör oluşturabilirsiniz.

Uyarı

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 ICalculatorSession sözleşmesi, WCF istemci nesnesinin herhangi bir başka işlemden önce Clear işlemini çalıştırmasını ve bu WCF istemci nesnesine ait oturumun Equals işlemi çalıştırdığında sonlandırılmasını 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

Servisler müşterilerle 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ı sonlandırır. İ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, ChannelFactory<TChannel>.CreateChannel çağrısının döndürdüğü kanalda.

  • Svcutil.exetarafından oluşturulan WCF istemci nesnesinde ClientBase<TChannel>.Close.

  • 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 yanı sıra Varsayılan Hizmet Davranışı ve Örnekleme örnekleri.

İstemciler ve oturumlar hakkında daha fazla bilgi için bkz. WCF İstemcisi Kullanarak Hizmetlere Erişme.

Oturumlar InstanceContext Ayarlarıyla Etkileşime Geçer

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, Örnekleme 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ış

Aktarmanız gereken çok fazla veri olduğunda, WCF'deki akış aktarım modu, iletileri bellekte arabelleğe alma ve işlemenin varsayılan davranışına makul bir alternatif olarak değerlendirilebilir. 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. Bir veya daha fazla istemci zaman aşımına uğrayabilir. Bu soruna geçici bir çözüm bulmak için, hizmet nesnesinin InstanceContextMode öğesini PerCall olarak veya Eşzamanlılık'ı birden çok olarak ayarlayabilirsiniz.

Uyarı

Kullanılabilir yalnızca bir "oturum" olduğundan, MaxConcurrentSessions'ın bu durumda bir etkisi yoktur.

Ayrıca bakınız