Sorban állás a WCF-ben
Ez a szakasz azt ismerteti, hogyan használható az üzenetsoros kommunikáció a Windows Communication Foundationben (WCF).
Üzenetsorok WCF-átviteli kötésként
A WCF-ben a szerződések határozzák meg, hogy mit cserélnek le. A szerződések üzleti vagy alkalmazásspecifikus üzenetcserék. Az üzenetek cseréjére használt mechanizmus (vagy a "how") a kötésekben van megadva. A WCF-kötések az üzenetcsere részleteit is belefoglalják. A konfigurációs gombokat teszik elérhetővé a felhasználó számára az átvitel vagy a kötések által képviselt protokoll különböző aspektusainak szabályozásához. A WCF-ben a sorba állítást minden más átviteli kötéshez hasonlóan kezelik, ami nagy előnyt jelent számos sorbanállási alkalmazás számára. Ma számos sorba sorba állítási alkalmazás másként van megírva, mint más távoli eljáráshívási (RPC)-stílusú elosztott alkalmazások, így nehezebb követni és karbantartani. A WCF-ben az elosztott alkalmazások írásának stílusa sokkal ugyanaz, így könnyebben követhető és karbantartható. Emellett az üzleti logikától elkülönítve az exchange mechanizmusának figyelembe adásával egyszerűbb konfigurálni az átvitelt, vagy módosításokat végezni rajta anélkül, hogy az alkalmazásspecifikus kódot érintené. Az alábbi ábra egy WCF-szolgáltatás és -ügyfél struktúráját mutatja be, amely az MSMQ-t átvitelként használja.
Ahogy az előző ábrán látható, az ügyfélnek és a szolgáltatásnak csak az alkalmazás szemantikáját kell meghatároznia, azaz a szerződést és a megvalósítást. A szolgáltatás egy várólista-kötést konfigurál az előnyben részesített beállításokkal. Az ügyfél a ServiceModel metadata segédprogrammal (Svcutil.exe) hoz létre egy WCF-ügyfelet a szolgáltatáshoz, és létrehoz egy konfigurációs fájlt, amely leírja az üzenetek szolgáltatásba küldéséhez használt kötéseket. Így egy üzenetsorba helyezett üzenet küldéséhez az ügyfél létrehoz egy WCF-ügyfelet, és meghív egy műveletet rajta. Ez azt eredményezi, hogy a rendszer elküldi az üzenetet az átviteli üzenetsornak, és átviszi a célsorba. Az üzenetsoros kommunikáció minden összetettsége el van rejtve az üzeneteket küldő és fogadó alkalmazás elől.
A WCF-ben az üzenetsoros kötésre vonatkozó figyelmeztetések a következők:
Minden szolgáltatásműveletnek egyirányúnak kell lennie, mert a WCF alapértelmezett várólistás kötése nem támogatja a kétoldalas kommunikációt üzenetsorok használatával. A kétirányú kommunikációs minta (kétirányú kommunikáció) bemutatja, hogyan lehet két egyirányú szerződést használni a kétirányú kommunikáció üzenetsorok használatával történő implementálásához.
A WCF-ügyfél metaadatok cseréjével történő létrehozásához további HTTP-végpontra van szükség a szolgáltatáson, hogy közvetlenül lekérdezhető legyen a WCF-ügyfél létrehozása és kötési információk beszerzése az üzenetsoros kommunikáció megfelelő konfigurálásához.
Az üzenetsoros kötés alapján a WCF-en kívül további konfigurációra van szükség. A WCF-sel szállított osztály például NetMsmqBinding megköveteli a kötések konfigurálását, valamint a Message Queuing (MSMQ) minimális konfigurálását.
A következő szakaszok az MSMQ-n alapuló WCF-sel szállított, várólistára helyezett kötéseket ismertetik.
MSMQ
A WCF üzenetsoros átvitele az MSMQ-t használja az üzenetsoros kommunikációhoz.
Az MSMQ opcionális összetevőként működik a Windowsban, és NT-szolgáltatásként fut. Rögzíti az üzeneteket az átviteli üzenetsorban való továbbításhoz és a célsoron való kézbesítéshez. Az MSMQ üzenetsor-kezelői megbízható üzenetátviteli protokollt implementálnak, hogy az üzenetek ne vesszenek el az átvitel során. A protokoll lehet natív vagy SOAP-alapú, például a SOAP Reliable Message Protocol (SRMP).
Az MSMQ-ban az üzenetsorok tranzakciós vagy nem tranzakciós jellegűek lehetnek. A tranzakciós üzenetsorok lehetővé teszik az üzenetek rögzítését és kézbesítését egy tranzakcióban, majd tartósan tárolhatók az üzenetsorban. A tranzakciós üzenetsorba küldött üzeneteket a rendszer pontosan egyszer, sorrendben továbbítja. A nem tranzakciós üzenetsorokkal változó és tartós üzeneteket is küldhet. A nem tranzakciós üzenetsorba küldött üzenetek nem nyújtanak megbízható átadási biztosítékokat; így az üzenetek elveszhetnek.
Az MSMQ-üzenetsorok az Active Directory címtárszolgáltatásban regisztrált Windows-identitással is védhetők. Az MSMQ telepítésekor telepítheti az Active Directory-integrációt, amely megköveteli, hogy a számítógép egy Windows-tartományhálózat része legyen.
Az MSMQ-ról további információt a Message Queuing (MSMQ) telepítése című témakörben talál.
NetMsmqBinding
A <netMsmqBinding> az üzenetsoros kötésű WCF két WCF-végpontot biztosít az MSMQ használatával történő kommunikációhoz. A kötés ezért az MSMQ-ra jellemző tulajdonságokat teszi elérhetővé. Azonban nem minden MSMQ-funkció és tulajdonság jelenik meg a NetMsmqBinding
. A kompakt NetMsmqBinding
kialakítás olyan optimális funkciókkal rendelkezik, amelyeket a legtöbb ügyfélnek elegendőnek kell találnia.
A NetMsmqBinding
kötések tulajdonságai formájában az eddig tárgyalt alapvető üzenetsor-kezelési fogalmak nyilvánulnak meg. Ezek a tulajdonságok viszont közlik az MSMQ-nak az üzenetek átvitelének és kézbesítésének módját. A tulajdonságkategóriákról a következő szakaszokban olvashat. További információkért tekintse meg azokat a fogalmi témaköröket, amelyek részletesebben ismertetik az adott tulajdonságokat.
ExactlyOnce és Tartós tulajdonságok
A ExactlyOnce
tulajdonságok és Durable
a tulajdonságok befolyásolják az üzenetek üzenetsorok közötti átvitelét:
ExactlyOnce
: Ha az alapértelmezett értékre vantrue
állítva, a várólistán lévő csatorna biztosítja, hogy az üzenet kézbesítése esetén ne ismétlődjön meg. Azt is biztosítja, hogy az üzenet ne vesszenek el. Ha az üzenet nem kézbesíthető, vagy a Time-To Live üzenet az üzenet kézbesítése előtt lejár, a sikertelen üzenet és a kézbesítési hiba oka egy kézbesítetlen üzenetsorban lesz rögzítve. Ha be vanfalse
állítva, a várólistán lévő csatorna erőfeszítéseket tesz az üzenet átvitelére. Ebben az esetben opcionálisan választhat egy kézbesítetlen üzenetsort.Durable:
Ha az alapértelmezett értékre vantrue
állítva, az üzenetsoros csatorna biztosítja, hogy az MSMQ tartósan tárolja az üzenetet a lemezen. Így ha az MSMQ szolgáltatás leáll és újraindul, a lemezen lévő üzenetek átkerülnek a célsorba, vagy a szolgáltatásba kerülnek. Ha be vanfalse
állítva, az üzeneteket a rendszer az illékony tárolóban tárolja, és elvesznek az MSMQ szolgáltatás leállítása és újraindítása során.
A megbízható átvitelhez ExactlyOnce
az MSMQ megköveteli, hogy az üzenetsor tranzakciós legyen. Az MSMQ-nak emellett egy tranzakciót is be kell olvasnia egy tranzakciós üzenetsorból. Ilyen esetben ne feledje, hogy az NetMsmqBinding
üzenetek küldéséhez vagy fogadásához tranzakcióra van szükség, ha ExactlyOnce
a beállítás értéke true
. Hasonlóképpen, az MSMQ megköveteli, hogy az üzenetsor ne tranzakciós legyen a legjobb erőkifejtés biztosítása érdekében, például mikor ExactlyOnce
van false
és változékony üzenetkezelés. Így ha a beállítás ExactlyOnce
értéke false
vagy tartós false
értéke, akkor nem küldhet vagy fogadhat tranzakciót.
Feljegyzés
Győződjön meg arról, hogy a megfelelő üzenetsor (tranzakciós vagy nem tranzakciós) létrejött a kötések beállításai alapján. Ha ExactlyOnce
igen true
, használjon tranzakciós üzenetsort, ellenkező esetben használjon nem tranzakciós üzenetsort.
A kézbesítetlen levelek üzenetsorának tulajdonságai
A kézbesítetlen levelek üzenetsora a sikertelen kézbesítésű üzenetek tárolására szolgál. A felhasználó írhat kompenzáló logikát, amely felolvassa az üzeneteket a kézbesítetlen levelek üzenetsorából.
Számos várólistás rendszer biztosít egy rendszerszintű üzenetsort. Az MSMQ rendszerszintű, nem tranzakciós kézbesítetlen levelek üzenetsort biztosít a nem tranzakciós üzenetsorokra történő kézbesítést meghiúsuló üzenetekhez, valamint egy rendszerszintű tranzakciós holtbetűs üzenetsort azokhoz az üzenetekhez, amelyek nem kézbesítenek tranzakciós üzenetsorokat.
Ha az MSMQ szolgáltatást több, különböző célsorra küldő ügyfél is megosztja, az ügyfelek által küldött összes üzenet ugyanarra a kézbesítetlen üzenetsorra kerül. Ez nem mindig előnyös. A jobb elkülönítés érdekében a WCF és az MSMQ a Windows Vista rendszerben egy egyéni kézbesítetlen üzenetsort (vagy alkalmazásspecifikus üzenetsort) biztosít, amelyet a felhasználó megadhat a sikertelen kézbesítésű üzenetek tárolásához. Ezért a különböző ügyfelek nem ugyanazt a kézbesítetlen üzenetsort osztják meg.
A kötés két érdekes tulajdonsággal rendelkezik:
DeadLetterQueue
: Ez a tulajdonság egy számbavétel, amely azt jelzi, hogy kér-e kézbesítetlen üzenetsort. Az enumerálás azt is tartalmazza, hogy milyen típusú üzenetsort kér a rendszer. Az értékek a következőkNone
: ,System
ésCustom
. A tulajdonságok értelmezésével kapcsolatos további információkért lásd : Üzenettovábbítási hibák kezelése holtbetűs üzenetsorok használatávalCustomDeadLetterQueue
: Ez a tulajdonság az alkalmazásspecifikus kézbesítetlen levelek üzenetsorának egységes erőforrás-azonosító (URI) címe. Erre akkor van szükség, haDeadLetterQueue
.Custom
van kiválasztva.
Poison Message Handling tulajdonságok
Ha a szolgáltatás üzeneteket olvas be a célsorból egy tranzakció alatt, előfordulhat, hogy a szolgáltatás különböző okokból nem tudja feldolgozni az üzenetet. Az üzenet ezután vissza lesz helyezve az üzenetsorba, hogy újra olvasható legyen. Az ismétlődően sikertelen üzenetek kezeléséhez konfigurálható a méregüzenet-kezelési tulajdonságok készlete a kötésben. Négy tulajdonság létezik: ReceiveRetryCount
, MaxRetryCycles
, RetryCycleDelay
és ReceiveErrorHandling
. További információ ezekről a tulajdonságokról: Poison Message Handling.
Biztonsági tulajdonságok
Az MSMQ saját biztonsági modelljét teszi elérhetővé, például hozzáférés-vezérlési listákat (ACL-eket) egy üzenetsoron, vagy hitelesített üzeneteket küld. Ezeket NetMsmqBinding
a biztonsági tulajdonságokat az átviteli biztonsági beállítások részeként teszi elérhetővé. A kötésnek két tulajdonsága van az átviteli biztonsághoz: MsmqAuthenticationMode
és MsmqProtectionLevel
. Gépház ezekben a tulajdonságokban az MSMQ konfigurálásáról van szó. További információ: Üzenetek biztonságossá tétele a Transport Security használatával.
Az átviteli biztonság mellett maga a SOAP-üzenet is védhető az üzenetbiztonság használatával. További információ: Üzenetek biztonságossá tétele üzenetbiztonság használatával.
MsmqTransportSecurity
két tulajdonságot is elérhetővé tesz, MsmqEncryptionAlgorithm
és MsmqHashAlgorithm
a . Ezek különböző algoritmusok felsorolásai, amelyeket az üzenetek üzenetsorok közötti átvitelének titkosításához és az aláírások kivonatolásához kell kiválasztani.
Egyéb tulajdonságok
Az előző tulajdonságok mellett a kötésben közzétett egyéb MSMQ-specifikus tulajdonságok a következők:
UseSourceJournal
: Egy tulajdonság, amely azt jelzi, hogy a forrásnaplózás be van kapcsolva. A forrásnaplózás egy MSMQ-funkció, amely nyomon követi az átviteli üzenetsorból sikeresen továbbított üzeneteket.UseMsmqTracing
: Egy tulajdonság, amely azt jelzi, hogy az MSMQ-nyomkövetés be van kapcsolva. Az MSMQ-nyomkövetés jelentésüzeneteket küld egy jelentéssorba minden alkalommal, amikor egy üzenet elhagyja vagy megérkezik egy MSMQ-üzenetsor-kezelőt üzemeltető gépre.QueueTransferProtocol
: A várólista-üzenetátvitelekhez használandó protokoll számbavétele. Az MSMQ implementál egy natív üzenetsor–üzenetsor átviteli protokollt és egy SOAP-alapú protokollt, a SOAP Reliable Messaging Protocol (SRMP) protokollt. Az SRMP http-átvitel esetén használatos a várólisták közötti átvitelhez. Az SRMP-biztonságot a RENDSZER a HTTPS protokoll használatával használja az üzenetsorok közötti átvitelekhez.UseActiveDirectory
: Logikai érték, amely jelzi, hogy az Active Directoryt fel kell-e használni az üzenetsor-címfeloldáshoz. Alapértelmezés szerint ez ki van kapcsolva. További információ: Szolgáltatásvégpontok és üzenetsor-címzés.
MsmqIntegrationBinding
Ez MsmqIntegrationBinding
akkor használatos, ha azt szeretné, hogy egy WCF-végpont kommunikáljon egy meglévő, C++, COM vagy System.Messaging API-kkal írt MSMQ-alkalmazással.
A kötés tulajdonságai megegyeznek NetMsmqBinding
a . A következő különbségek azonban érvényesek:
A műveleti szerződés
MsmqIntegrationBinding
egyetlen típusparaméterre MsmqMessage<T> korlátozódik, ahol a típusparaméter a törzs típusa.Az MSMQ natív üzenettulajdonságainak nagy része használatban MsmqMessage<T> van.
Az üzenet törzsének szerializálásához és deszerializálásához szerializálókat, például XML-t és ActiveX-et biztosítunk.
Mintakód
Az MSMQ-t használó WCF-szolgáltatások írására vonatkozó részletes útmutatásért tekintse meg az alábbi témaköröket:
Útmutató: Exchange-üzenetek WCF-végpontokkal és Üzenetsor-kezelési alkalmazásokkal
Útmutató: Üzenetsorba helyezett üzenetek cseréje WCF-végpontokkal
Az MSMQ WCF-ben való használatát szemléltető kész kódmintát a következő témakörökben talál: