Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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
Telepítse a ASP.NET 4.0-t az alábbi paranccsal.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableGyő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.
A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.
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.