Megosztás:


HttpCookieSession

A HttpCookieSession minta bemutatja, hogyan hozhat létre egyéni protokollcsatornát HTTP-cookie-k használatára a munkamenet-kezeléshez. Ez a csatorna lehetővé teszi a Windows Communication Foundation (WCF) szolgáltatások és az ASMX-ügyfelek, illetve a WCF-ügyfelek és az ASMX-szolgáltatások közötti kommunikációt.

Amikor egy ügyfél munkamenet-alapú ASMX-webszolgáltatásban meghív egy webes metódust, a ASP.NET motor a következőket teszi:

  • Egyedi azonosítót (munkamenet-azonosítót) hoz létre.

  • Létrehozza a munkamenet-objektumot, és társítja az egyedi azonosítóval.

  • Hozzáadja az egyedi azonosítót egy Set-Cookie HTTP-válaszfejléchez, és továbbítja a kliensnek.

  • Azonosítja az ügyfelet a következő hívások során az általa küldött munkamenet-azonosító alapján.

Az ügyfél ezt a munkamenet-azonosítót a kiszolgálóra irányuló későbbi kéréseiben is tartalmazza. A kiszolgáló az ügyfél munkamenet-azonosítóját használja az aktuális HTTP-környezet megfelelő munkamenet-objektumának betöltéséhez.

HttpCookieSession Csatorna üzenetcsere mintája

Ez a minta lehetővé teszi az ASMX-hez hasonló forgatókönyvek munkameneteit. A protokoll verem alján található a HTTP átvitel, amely támogatást nyújt IRequestChannel és IReplyChannel számára. A csatorna feladata, hogy munkameneteket biztosítson a csatornaréteg magasabb szintjeinek. A minta két csatornát implementál (IRequestSessionChannel és IReplySessionChannel), amelyek támogatják a munkameneteket.

Szolgáltatáscsatorna

A minta szolgáltatáscsatornát biztosít az HttpCookieReplySessionChannelListener osztályban. Ez az osztály implementálja a IChannelListener felületet, és átalakítja a IReplyChannel csatornát a csatorna réteg alsó részéből egy IReplySessionChannel-vé. Ez a folyamat a következő részekre osztható:

  • A csatornafigyelő megnyitásakor egy belső csatornát fogad el a belső figyelőből. Mivel a belső figyelő egy datagram-figyelő, és az elfogadott csatorna élettartama függetlenítve van a figyelő élettartamától, bezárhatjuk a belső figyelőt, és csak a belső csatornához ragaszkodhatunk

                this.innerChannelListener.Open(timeoutHelper.RemainingTime());
    this.innerChannel = this.innerChannelListener.AcceptChannel(timeoutHelper.RemainingTime());
    this.innerChannel.Open(timeoutHelper.RemainingTime());
    this.innerChannelListener.Close(timeoutHelper.RemainingTime());
    
  • Amikor a nyitott folyamat befejeződik, beállítunk egy üzenethurkot, amely üzeneteket fogad a belső csatornáról.

    IAsyncResult result = BeginInnerReceiveRequest();
    if (result != null && result.CompletedSynchronously)
    {
       // do not block the user thread
       this.completeReceiveCallback ??= new WaitCallback(CompleteReceiveCallback);
       ThreadPool.QueueUserWorkItem(this.completeReceiveCallback, result);
    }
    
  • Amikor egy üzenet érkezik, a szolgáltatási csatorna megvizsgálja a munkamenet-azonosítót, és szétválasztja a megfelelő munkamenet-csatornára. A csatornafigyelő egy szótárat tart fenn, amely leképozza a munkamenet-azonosítókat a munkamenet-csatorna példányaihoz.

    Dictionary<string, IReplySessionChannel> channelMapping;
    

Az HttpCookieReplySessionChannel osztály implementálja .IReplySessionChannel A csatornaverem magasabb szintjei meghívják a ReceiveRequest metódust, hogy olvassák a kéréseket ehhez a munkamenethez. Minden munkamenet-csatorna rendelkezik egy privát üzenetsorsal, amelyet a szolgáltatáscsatorna tölt fel.

InputQueue<RequestContext> requestQueue;

Abban az esetben, ha valaki meghívja a ReceiveRequest metódust, és nincsenek üzenetek az üzenetsorban, a csatorna meghatározott ideig várakozik, mielőtt leállítja magát. Ez törli a nem WCF-ügyfelek számára létrehozott munkamenet-csatornákat.

A channelMapping használjuk a ReplySessionChannels nyomon követésére, és nem zárjuk be az alapul szolgáló innerChannel-t, amíg az összes elfogadott csatornát be nem zárjuk. Így HttpCookieReplySessionChannelHttpCookieReplySessionChannelListener élettartama után is létezhet. Nem kell amiatt sem aggódnunk, hogy a figyelő begyűjti alattunk a szemetet, mert az elfogadott csatornák a visszahíváson keresztül hivatkoznak a OnClosed figyelőjükre.

Ügyfélcsatorna

A megfelelő ügyfélcsatorna az HttpCookieSessionChannelFactory osztályban található. A csatorna létrehozása során a csatorna-előállító becsomagolja a belső kéréscsatornát egy HttpCookieRequestSessionChannel segítségével. Az HttpCookieRequestSessionChannel osztály továbbítja a hívásokat a mögöttes kéréscsatornának. Amikor az ügyfél bezárja a proxyt, HttpCookieRequestSessionChannel üzenetet küld a szolgáltatásnak, amely jelzi a csatorna bezárását. Így a szolgáltatási csatornahalmaz zavartalanul leállíthatja a használatban lévő munkamenet-csatornát.

Kötés és kötéselemi rész

A szolgáltatás és az ügyfélcsatornák létrehozása után a következő lépés az, hogy integrálja őket a WCF-futtatókörnyezetbe. A csatornák kötéseken és kötési elemeken keresztül érhetők el a WCF-nek. A kötések egy vagy több kötéselemből állnak. A WCF számos rendszer által definiált kötést kínál; Például: BasicHttpBinding vagy WSHttpBinding. Az HttpCookieSessionBindingElement osztály tartalmazza a kötéselem implementálását. Felülbírálja a csatornafigyelőt és a csatorna-előállító létrehozási módszereit a szükséges csatornafigyelő vagy csatorna-előállító példányosításához.

A minta szabályzat-állításokat használ a szolgáltatás leírásához. Ez lehetővé teszi, hogy a minta közzétegye a csatornakövetelményeit más ügyfelek számára, amelyek használhatják a szolgáltatást. Ez a kötési elem például közzéteszi a szabályzat-állításokat, hogy jelezze a potenciális ügyfelek számára, hogy támogatja a munkameneteket. Mivel a minta engedélyezi a ExchangeTerminateMessage tulajdonságot a kötéselem-konfigurációban, hozzáadja a szükséges állításokat annak bemutatásához, hogy a szolgáltatás támogatja a munkamenet-beszélgetés megszakításához szükséges további üzenetcsere műveletet. Az ügyfelek ezután használhatják ezt a műveletet. Az alábbi WSDL-kód a házirend-állításokat mutatja be, amelyeket a HttpCookieSessionBindingElement alapján hoztak létre.

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

Az HttpCookieSessionBinding osztály egy rendszer által biztosított kötés, amely a korábban ismertetett kötési elemet használja.

A csatorna hozzáadása a konfigurációs rendszerhez

A minta két osztályt biztosít, amelyek a konfiguráción keresztül teszik elérhetővé a mintacsatornát. Az első egy BindingElementExtensionElement a HttpCookieSessionBindingElement számára. Az implementáció nagy része a HttpCookieSessionBindingConfigurationElement számára van delegálva, amely a StandardBindingElement-ből származik. A HttpCookieSessionBindingConfigurationElement tulajdonság a következő tulajdonságoknak felel meg HttpCookieSessionBindingElement: .

Kötéselem-bővítmény szakasza

Ez a HttpCookieSessionBindingElementSection szakasz elérhetővé teszi a BindingElementExtensionElement a konfigurációs rendszer számára. A konfigurációs szakasz neve, a kötési elem típusa és a kötéselem létrehozásának módja néhány felülírással meghatározásra kerül. Ezután regisztrálhatjuk a bővítményszakaszt egy konfigurációs fájlban az alábbiak szerint:

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

Tesztkód

A mintaátvitel használatára vonatkozó tesztkód az ügyfél- és szolgáltatáskönyvtárakban érhető el. Két tesztből áll – az egyik teszt egy kötést használ, amelyet az ügyfélnél allowCookies be van állítva true-re. A második teszt explicit leállítást tesz lehetővé (a leállítási üzenet cseréjével) a kötésen.

A minta futtatásakor a következő kimenetnek kell megjelennie:

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.

A példa beállítása, elkészítése és futtatása

  1. Telepítse a ASP.NET 4.0-t az alábbi paranccsal.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.

  3. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

  4. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.