Aracılığıyla paylaş


HTTP Çerez Oturumu

HttpCookieSession örneği, oturum yönetimi için HTTP tanımlama bilgilerini kullanmak üzere özel bir protokol kanalı oluşturmayı gösterir. Bu kanal, Windows Communication Foundation (WCF) hizmetleri ile ASMX istemcileri arasında veya WCF istemcileri ile ASMX hizmetleri arasında iletişim sağlar.

İstemci oturum tabanlı bir ASMX Web hizmetinde Bir Web yöntemini çağırdığında, ASP.NET altyapısı aşağıdakileri yapar:

  • Benzersiz bir kimlik (oturum kimliği) oluşturur.

  • Oturum nesnesini oluşturur ve benzersiz kimlikle ilişkilendirir.

  • Benzersiz kimliği Set-Cookie HTTP yanıt üst bilgisine ekler ve istemciye gönderir.

  • İstemciyi, kendisine gönderdiği oturum kimliğine göre sonraki çağrılarda tanımlar.

İstemci, sunucuya yönelik sonraki isteklerine bu oturum kimliğini ekler. Sunucu, geçerli HTTP bağlamı için uygun oturum nesnesini yüklemek için istemciden oturum kimliğini kullanır.

HttpCookieSession Kanal Mesajlaşma Değişim Modeli

Bu örnek ASMX benzeri senaryolar için oturumları etkinleştirir. Kanal yığınımızın en altında, IRequestChannel ve IReplyChannel'i destekleyen HTTP aktarımı bulunur. Kanal yığınının daha yüksek düzeylerine oturumlar sağlamak, kanalın görevidir. Örnek, oturumları destekleyen iki kanal (IRequestSessionChannel ve IReplySessionChannel) uygular.

Hizmet Kanalı

Örnek, HttpCookieReplySessionChannelListener sınıfında bir hizmet kanalı sağlar. Bu sınıf IChannelListener arabirimini uygular ve IReplyChannel kanalını, kanal yığınının altından alarak bir IReplySessionChannel'ye dönüştürür. Bu işlem aşağıdaki bölümlere ayrılabilir:

  • Kanal dinleyicisi açıldığında, iç dinleyicisinden bir iç kanalı kabul eder. İç dinleyici bir datagram dinleyicisi olduğu ve kabul edilen bir kanalın ömrü dinleyicinin ömründen bağımsız hale getirildiği için, iç dinleyiciyi kapatabilir ve yalnızca iç kanalı açık tutabiliriz.

                this.innerChannelListener.Open(timeoutHelper.RemainingTime());
    this.innerChannel = this.innerChannelListener.AcceptChannel(timeoutHelper.RemainingTime());
    this.innerChannel.Open(timeoutHelper.RemainingTime());
    this.innerChannelListener.Close(timeoutHelper.RemainingTime());
    
  • Açma işlemi tamamlandığında, iç kanaldan ileti almak için bir ileti döngüsü ayarlarız.

    IAsyncResult result = BeginInnerReceiveRequest();
    if (result != null && result.CompletedSynchronously)
    {
       // do not block the user thread
       this.completeReceiveCallback ??= new WaitCallback(CompleteReceiveCallback);
       ThreadPool.QueueUserWorkItem(this.completeReceiveCallback, result);
    }
    
  • Bir mesaj geldiğinde, hizmet kanalı oturum tanımlayıcısını inceler ve uygun oturum kanalına yönlendirir. Kanal dinleyicisi, oturum tanımlayıcılarını oturum kanalı örnekleriyle eşleyen bir sözlük tutar.

    Dictionary<string, IReplySessionChannel> channelMapping;
    

HttpCookieReplySessionChannel sınıfı IReplySessionChannel uygular. Kanal yığınının üst düzeyleri, bu oturuma yönelik istekleri okumak için ReceiveRequest yöntemini çağırır. Her oturum kanalı, hizmet kanalı tarafından doldurulan özel bir ileti kuyruğuna sahiptir.

InputQueue<RequestContext> requestQueue;

Bir kişi ReceiveRequest yöntemini çağırır ve ileti kuyruğunda ileti yoksa, kanal kendisini kapatmadan önce belirli bir süre bekler. Bu, WCF olmayan istemciler için oluşturulan oturum kanallarını temizler.

channelMappingReplySessionChannels takip etmek için kullanırız ve kabul edilen tüm kanallar kapatılana kadar altta yatan innerChannel'ü kapatmayız. Bu şekilde HttpCookieReplySessionChannel, HttpCookieReplySessionChannelListener ömrünün ötesinde var olabilir. Ayrıca, kabul edilen kanallar geri çağrı aracılığıyla dinleyicilerini referans aldıkları için dinleyicinin bizim kontrolümüz dışındayken çöp toplanması konusunda endişelenmemiz gerekmez.

Müşteri kanalı

İlgili istemci kanalı HttpCookieSessionChannelFactory sınıfındadır. Kanal oluşturma sırasında kanal fabrikası iç istek kanalını HttpCookieRequestSessionChannel ile sarar. sınıfı, HttpCookieRequestSessionChannel çağrıları temel alınan istek kanalına iletir. İstemci ara sunucuyu kapattığında, HttpCookieRequestSessionChannel hizmete kanalın kapatıldığını belirten bir ileti gönderir. Bu nedenle, hizmet kanalı yığını kullanımda olan oturum kanalını düzgün bir şekilde kapatabilir.

Bağlama ve Bağlama Öğesi

Hizmet ve istemci kanallarını oluşturduktan sonra, sonraki adım bunları WCF çalışma zamanıyla tümleştirmektir. Kanallar bağlamalar ve bağlama öğeleri aracılığıyla WCF'ye sunulur. Bağlama bir veya birden çok bağlama öğesinden oluşur. WCF çeşitli sistem tanımlı bağlamalar sunar; örneğin, TemelHttpBinding veya WSHttpBinding. HttpCookieSessionBindingElement sınıfı bağlama öğesinin uygulamasını içerir. Gerekli kanal dinleyicisini veya kanal fabrikası örneklemelerini yapmak için kanal dinleyicisini ve kanal fabrikası oluşturma yöntemlerini geçersiz kılar.

Hizmet açıklaması için örnek, politika ilkelerini kullanır. Bu, numunenin kanal gereksinimlerini hizmeti kullanabilen diğer istemcilere yayımlamasına olanak tanır. Örneğin, bu bağlama öğesi, olası istemcilere oturumları desteklediğini bildirmek için ilke onayları yayımlar. Örnek, bağlama öğesi yapılandırmasında ExchangeTerminateMessage özelliğini etkinleştirdiğinden, hizmetin bir oturum görüşmesini sonlandırmak için ek bir mesaj değişim eylemini desteklediğini göstermek amacıyla gerekli doğrulamaları ekler. Müşteriler bu eylemi kullanabilir. Aşağıdaki WSDL kodu, HttpCookieSessionBindingElement öğesinden oluşturulan ilke onaylarını gösterir.

<wsp:Policy wsu:Id="HttpCookieSessionBinding_IWcfCookieSessionService_policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:ExactlyOne>
<wsp:All>
<wspe:Utf816FFFECharacterEncoding xmlns:wspe="http://schemas.xmlsoap.org/ws/2004/09/policy/encoding"/>
<mhsc:httpSessionCookie xmlns:mhsc="http://samples.microsoft.com/wcf/mhsc/policy"/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>

HttpCookieSessionBinding sınıfı, daha önce açıklanan bağlama öğesini kullanan sistem tarafından sağlanan bir bağlamadır.

Kanalı Yapılandırma Sistemine Ekleme

Örnek, yapılandırma aracılığıyla örnek kanalı kullanıma sunan iki sınıf sağlar. İlki BindingElementExtensionElement için HttpCookieSessionBindingElement. Uygulamanın büyük bir kısmı, HttpCookieSessionBindingConfigurationElement'den türetilen StandardBindingElement'a devredildi. üzerindeki HttpCookieSessionBindingConfigurationElement özelliklere karşılık gelen özelliklere HttpCookieSessionBindingElementsahiptir.

Bağlama Öğesi Uzantısı Bölümü

Bölüm HttpCookieSessionBindingElementSection, BindingElementExtensionElement'yi yapılandırma sistemine tanıtan bir HttpCookieSessionBindingElement'dır. Yapılandırma bölümü adı, bağlama öğesinin türü ve bağlama öğesinin nasıl oluşturulacağı, birkaç geçersiz kılma ile tanımlanır. Ardından uzantı bölümünü bir yapılandırma dosyasına aşağıdaki gibi kaydedebiliriz:

<configuration>
    <system.serviceModel>
      <extensions>
        <bindingElementExtensions>
          <add name="httpCookieSession"
               type=
"Microsoft.ServiceModel.Samples.HttpCookieSessionBindingElementElement,
                    HttpCookieSessionExtension, Version=1.0.0.0,
                    Culture=neutral, PublicKeyToken=null"/>
        </bindingElementExtensions >
      </extensions>

      <bindings>
      <customBinding>
        <binding name="allowCookiesBinding">
          <textMessageEncoding messageVersion="Soap11WSAddressing10" />
          <httpCookieSession sessionTimeout="10" exchangeTerminateMessage="true" />
          <httpTransport allowCookies="true" />
        </binding>
      </customBinding>
      </bindings>
    </system.serviceModel>
</configuration>

Test Kodu

Bu örnek aktarımı kullanmak için test kodu İstemci ve Hizmet dizinlerinde kullanılabilir. İki testten oluşur; bir test, istemcide allowCookies ile true olarak ayarlanmış bir bağlamayı kullanır. İkinci test, sonlandırma mesajı alışverişini kullanarak bağlamada açık bir kapatmayı sağlar.

Örneği çalıştırdığınızda aşağıdaki çıkışı görmeniz gerekir:

Simple binding:
AddItem(10000,2): ItemCount=2
AddItem(10550,5): ItemCount=7
RemoveItem(10550,2): ItemCount=5
Items
10000, 2
10550, 3
Smart binding:
AddItem(10000,2): ItemCount=2
AddItem(10550,5): ItemCount=7
RemoveItem(10550,2): ItemCount=5
Items
10000, 2
10550, 3

Press <ENTER> to terminate client.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Aşağıdaki komutu kullanarak ASP.NET 4.0'ı yükleyin.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  3. Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  4. Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.