HttpCookieSession

Ukázka HttpCookieSession ukazuje, jak vytvořit vlastní kanál protokolu pro použití souborů cookie HTTP pro správu relací. Tento kanál umožňuje komunikaci mezi službami WCF (Windows Communication Foundation) a klienty ASMX nebo mezi klienty WCF a službami ASMX.

Když klient volá webovou metodu ve webové službě ASMX, která je založená na relacích, modul ASP.NET provede následující akce:

  • Vygeneruje jedinečné ID (ID relace).

  • Vygeneruje objekt relace a přidruží ho k jedinečnému ID.

  • Přidá jedinečné ID do Set-Cookie hlavičky odpovědi HTTP a odešle ho klientovi.

  • Identifikuje klienta při následných voláních na základě ID relace, které do něj odesílá.

Klient do následných požadavků na server zahrne toto ID relace. Server používá ID relace z klienta k načtení příslušného objektu relace pro aktuální kontext HTTP.

Model výměny zpráv kanálu HttpCookieSession

Tato ukázka umožňuje spouštění relací pro scénáře, které jsou podobné ASMX. V dolní části zásobníku kanálů máme přenos HTTP, který podporuje IRequestChannel a IReplyChannel. Je úlohou kanálu poskytovat relace na vyšších úrovních zásobníku kanálů. Ukázka implementuje dva kanály, které podporují relace (IRequestSessionChannel a IReplySessionChannel).

Kanál služby

Ukázka poskytuje kanál služby ve HttpCookieReplySessionChannelListener třídě. Tato třída implementuje IChannelListener rozhraní a převádí IReplyChannel kanál z nižší úrovně v zásobníku kanálů na IReplySessionChannel. Tento proces lze rozdělit do následujících částí:

  • Při otevření nasluchače kanálu přijímá vnitřní kanál ze svého interního nasluchače. Protože vnitřní posluchač je posluchač datagramů a doba životnosti přijatého kanálu je oddělena od doby životnosti posluchače, můžeme zavřít vnitřního posluchače a držet pouze vnitřní kanál.

                this.innerChannelListener.Open(timeoutHelper.RemainingTime());
    this.innerChannel = this.innerChannelListener.AcceptChannel(timeoutHelper.RemainingTime());
    this.innerChannel.Open(timeoutHelper.RemainingTime());
    this.innerChannelListener.Close(timeoutHelper.RemainingTime());
    
  • Po dokončení otevřeného procesu nastavíme smyčku zpráv pro příjem zpráv z vnitřního kanálu.

    IAsyncResult result = BeginInnerReceiveRequest();
    if (result != null && result.CompletedSynchronously)
    {
       // do not block the user thread
       this.completeReceiveCallback ??= new WaitCallback(CompleteReceiveCallback);
       ThreadPool.QueueUserWorkItem(this.completeReceiveCallback, result);
    }
    
  • Když přijde zpráva, kanál služby zkontroluje identifikátor relace a rozdělí ji do příslušného kanálu relace. Posluchač kanálu udržuje slovník mapující identifikátory relace na instance kanálu relace.

    Dictionary<string, IReplySessionChannel> channelMapping;
    

Třída HttpCookieReplySessionChannel implementuje IReplySessionChannel. Vyšší úrovně zásobníku kanálu volají metodu ReceiveRequest pro čtení požadavků pro tuto relaci. Každý kanál relace má soukromou frontu zpráv, kterou naplňuje kanál služby.

InputQueue<RequestContext> requestQueue;

V případě, že někdo volá metodu ReceiveRequest a ve frontě zpráv nejsou žádné zprávy, kanál počká na určitou dobu, než se vypne. Tím se vyčistí kanály relace vytvořené pro klienty bez WCF.

Používáme channelMapping ke sledování ReplySessionChannels a nezavíráme naše základní innerChannel, dokud nebudou uzavřeny všechny přijaté kanály. Tímto způsobem HttpCookieReplySessionChannel může existovat i po celou dobu života HttpCookieReplySessionChannelListener. Také si nemusíme dělat starosti s tím, že posluchač pod námi bude vyčištěn z paměti, protože přijaté kanály udržují odkaz na svého posluchače prostřednictvím zpětného volání OnClosed.

Klientský kanál

Odpovídající klientský kanál je ve HttpCookieSessionChannelFactory třídě. Při vytváření kanálu zabalí továrna kanálů vnitřní požadavek kanálem HttpCookieRequestSessionChannel. Třída HttpCookieRequestSessionChannel přesměruje volání do podkladového kanálu požadavku. Když klient proxy server zavře, HttpCookieRequestSessionChannel odešle službě zprávu, která indikuje, že kanál je zavřený. Služební kanálový zásobník může proto hladce vypnout kanál relace, který se používá.

Vazba a Vazební prvek

Po vytvoření služeb a klientských kanálů je dalším krokem jejich integrace do modulu runtime WCF. Kanály jsou zpřístupněny WCF prostřednictvím vazeb a prvkových vazeb. Vazba se skládá z jednoho nebo několika prvků vazby. WCF nabízí několik systémově definovaných vazeb; Například BasicHttpBinding nebo WSHttpBinding. Třída HttpCookieSessionBindingElement obsahuje implementaci pro element vazby. Přepíše naslouchací proces kanálu a metody vytváření kanálů pro vytváření, aby bylo možné provést potřebné instance naslouchacího procesu kanálu nebo vytváření instancí kanálu.

Ukázka používá prohlášení o zásadách pro popis služby. Tato ukázka umožňuje publikovat požadavky na kanál ostatním klientům, kteří můžou službu využívat. Tento vazební prvek například publikuje prohlášení zásad, aby potenciální klienti zjistili, že podporuje relace. Protože příklad umožňuje vlastnost ExchangeTerminateMessage v konfiguraci prvku vazby, přidává potřebné verifikační výrazy, které ukazují, že služba podporuje další akci při výměně zpráv pro ukončení konverzace relace. Klienti pak mohou tuto akci použít. Následující kód WSDL ukazuje zásadové výroky vytvořené z HttpCookieSessionBindingElement.

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

Třída HttpCookieSessionBinding je systémová vazba, která používá element vazby popsané výše.

Přidání kanálu do konfiguračního systému

Ukázka poskytuje dvě třídy, které zpřístupňují ukázkový kanál prostřednictvím konfigurace. První je BindingElementExtensionElement pro HttpCookieSessionBindingElement. Většina implementace je delegována na HttpCookieSessionBindingConfigurationElement, která je odvozena od StandardBindingElement. Obsahuje HttpCookieSessionBindingConfigurationElement vlastnosti, které odpovídají vlastnostem v HttpCookieSessionBindingElement.

Oddíl rozšíření prvku spojování

Oddíl HttpCookieSessionBindingElementSection je BindingElementExtensionElement, který zpřístupňuje HttpCookieSessionBindingElement konfiguračnímu systému. Pomocí několika přepsání jsou definovány název konfigurační sekce, typ elementu vazby a způsob vytvoření elementu vazby. Pak můžeme sekci rozšíření zaregistrovat v konfiguračním souboru následujícím způsobem:

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

Testovací kód

Testovací kód pro použití tohoto ukázkového přenosu je k dispozici v adresářích klienta a služeb. Skládá se ze dvou testů—jeden test používá vazbu, která je na straně klienta nastavena na allowCookiestrue. Druhý test umožňuje explicitní vypnutí (pomocí ukončení výměny zpráv) na vazbě.

Při spuštění ukázky by se měl zobrazit následující výstup:

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.

Jak nastavit, sestavit a spustit ukázku

  1. Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  3. Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  4. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.