Megosztás a következőn keresztül:


Egyéni kódolók

Ez a témakör az egyéni kódolók létrehozását ismerteti.

A Windows Communication Foundationben (WCF) egy kötéssel adhatja meg, hogyan továbbíthat adatokat a hálózaton a végpontok között. A kötések kötési elemek sorozatából áll. A kötések olyan opcionális protokollkötési elemeket tartalmaznak, mint a biztonság, egy kötelező Üzenetkódoló kötési elem és egy kötelező átviteli kötési elem. Az üzenetkódolót üzenetkódoló kötéselem jelöli. A WCF három üzenetkódolót tartalmaz: bináris, üzenetátvitel-optimalizálási mechanizmus (MTOM) és szöveg.

Az üzenetkódoló kötéselemek szerializálják a kimenő Message üzeneteket, és továbbítják azt az átvitelnek, vagy megkapják az üzenet szerializált formáját az átvitelből, és átadják azt a protokollrétegnek, ha vannak, vagy az alkalmazásnak, ha nincs jelen.

Az üzenetkódolók átalakítják Message a példányokat a vezetékek ábrázolására és azok alapján. Bár a kódolók a csatornaverem átviteli rétege felett találhatók, az átviteli rétegen belül találhatók. A transzportok (például HTTP) az üzenet formátumát az átviteli szabvány követelményeinek megfelelően formázza. A kódolók (például a Text Xml) csak az üzenetet kódolják.

Ha egy már meglévő ügyfélhez vagy kiszolgálóhoz csatlakozik, előfordulhat, hogy nincs más választása, mint egy adott üzenetkódolást használni. A WCF-szolgáltatások azonban több végponton keresztül is elérhetővé tehetők, mindegyik más üzenetkódolóval. Ha egyetlen kódoló nem fedi le a szolgáltatás teljes célközönségét, fontolja meg a szolgáltatás több végponton keresztüli felfedését. Az ügyfélalkalmazások ezután kiválaszthatják a számukra legmegfelelőbb végpontot. Több végpont használatával kombinálhatja a különböző üzenetkódolók előnyeit más kötési elemekkel.

Rendszer által biztosított kódolók

A WCF számos rendszer által biztosított kötést biztosít, amelyek a leggyakoribb alkalmazási forgatókönyvek lefedésére szolgálnak. Ezek a kötések egyesítik az átvitelt, az üzenetkódolót és más lehetőségeket (például a biztonságot). Ez a témakör azt ismerteti, hogyan terjesztheti ki a TextWCF-ben található , Binaryés MTOM üzenetkódolókat, vagy hogyan hozhat létre saját egyéni kódolót. A szöveges üzenetkódoló támogatja az egyszerű XML-kódolást és a SOAP-kódolást is. A szöveges üzenetkódoló egyszerű XML-kódolási módját POX ("Egyszerű régi XML") kódolónak nevezzük, amely megkülönbözteti a szövegalapú SOAP-kódolástól.

A rendszer által biztosított kötések által biztosított kötéselemek kombinációiról további információt a Szállítás kiválasztása című szakasz megfelelő szakaszában talál.

A rendszer által biztosított kódolók működése

A rendszer egy kódolást ad hozzá egy kötéshez egy, a forrásból MessageEncodingBindingElementszármaztatott osztály használatával.

A WCF a következő típusú kötéselemeket biztosítja az MessageEncodingBindingElement osztályból, amelyek képesek szöveges, bináris és üzenetátviteli optimalizálási mechanizmus (MTOM) kódolására:

  • TextMessageEncodingBindingElement: A leginkább együttműködő, de az XML-üzenetek legkevésbé hatékony kódolója. A webszolgáltatás vagy a webszolgáltatás-ügyfél általánosan megértheti a szöveges XML-t. A bináris adatok nagy blokkjainak szövegként való továbbítása azonban nem hatékony.

  • BinaryMessageEncodingBindingElement: A bináris xml-üzenetekhez használt karakterkódolást és üzenetverziót meghatározó kötési elemet jelöli. Ez a leghatékonyabb a kódolási lehetőségek közül, de a legkevésbé interoperálható, mivel csak a WCF-végpontok támogatják.

  • MtomMessageEncodingBindingElement: Azt a kötési elemet jelöli, amely meghatározza az üzenethez használt karakterkódolást és az üzenet verziószámozását egy Üzenetátviteli optimalizálási mechanizmus (MTOM) kódolásával. Az MTOM egy hatékony technológia a bináris adatok WCF-üzenetekben való továbbításához. Az MTOM kódoló megpróbálja egyensúlyt teremteni a hatékonyság és az interoperabilitás között. Az MTOM kódolás a legtöbb XML-t szöveges formában továbbítja, de a bináris adatok nagy blokkjait optimalizálja úgy, hogy a szöveggé alakítás nélkül továbbítja őket.

A kötési elem létrehoz egy bináris, MTOM vagy szöveg .MessageEncoderFactory A gyár létrehoz egy bináris, MTOM vagy szöveges MessageEncoderFactory példányt. Általában csak egyetlen példány létezik. Munkamenetek használata esetén azonban minden munkamenethez más kódolót lehet biztosítani. A bináris kódoló ezt használja a dinamikus szótárak koordinálásához (lásd az XML-infrastruktúrát).

A ReadMessage kódolók magját a metódusok képezik WriteMessage . A metódusok lehetővé teszik egy üzenet streamből vagy tömbből való olvasását Byte . A bájttömböket akkor használja a rendszer, ha az átvitel pufferelt módban működik. Az üzenetek mindig streamekre vannak írva. Ha az átvitelnek pufferelnie kell az üzenetet, egy streamet biztosít, amely elvégzi a pufferelést.

A többi tag támogatási tartalommal, médiatípusokkal és MessageVersion. Az átvitel meghívja ezeket a kódoló metódusokat annak ellenőrzésére, hogy a bejövő üzenet dekódolható-e, vagy hogy a kimenő üzenet érvényes-e erre a kódolóra.

A három kódoló implementáció mindegyike olyan tulajdonságokat ad hozzá, amelyek relevánsak az adott kódolásokhoz, és teljes mértékben konfigurálhatók. A kódolók emellett olyan olvasókvótákat is közzétenek, amelyek biztonságos alapértelmezett értékekkel rendelkeznek. A kvóták megvitatásához tekintse meg az XML-infrastruktúrát.

A rendszer által biztosított kódolók funkciói

A rendszer által biztosított kódolók számos funkciót biztosítanak.

Készletezés

Az egyes kódoló-implementációk a lehető legnagyobb mértékben próbálnak készletet létrehozni. A foglalások csökkentése kulcsfontosságú módszer a felügyelt kód teljesítményének javítására. A készletezés végrehajtásához az implementációk az osztályt SynchronizedPool használják. A C#-fájl az osztály által használt további optimalizálások leírását tartalmazza.

XmlDictionaryReader és XmlDictionaryWriter a példányok egyesítve és újrainicializálva vannak, hogy ne lehessen újakat kiosztani az egyes üzenetekhez. Az olvasók számára a OnClose visszahívás visszahívással kéri vissza az olvasót, amikor Close() meghívják. A kódoló az üzenetek létrehozásakor használt egyes üzenetállapot-objektumokat is újrahasznosítja. Ezeknek a készleteknek a méreteit a MaxReadPoolSize három osztály MessageEncodingBindingElementtulajdonságai és MaxWritePoolSize tulajdonságai konfigurálják.

Bináris kódolás

Amikor a bináris kódolás munkameneteket használ, a dinamikus szótári sztringet közölni kell az üzenet fogadójának. Ez az üzenet dinamikus szótári sztringekkel való előtagolásával történik. A fogadó leválasztja a sztringeket, hozzáadja őket a munkamenethez, és feldolgozza az üzenetet. A szótári sztringek helyes átadásához az átvitel pufferelése szükséges.

A sztringeket egy belső AddSessionInformationToMessage metódus fűzi hozzá az üzenethez. A sztringeket UTF-8-asként adja hozzá az üzenet elejéhez, a hosszukkal együtt. Ezután a teljes szótárfejléc előtagot ad meg az adatok hosszával. A fordított műveletet egy belső ExtractSessionInformationFromMessage metódus hajtja végre.

A dinamikus szótárkulcsok feldolgozása mellett a pufferelt munkamenet-üzenetek is egyedi módon érkeznek. Ahelyett, hogy olvasót hoz létre a dokumentumon keresztül, és feldolgozta volna, a bináris kódoló a belső MessagePatterns osztályt használja a bináris adatfolyam dekonstruálásához. Az elképzelés az, hogy a legtöbb üzenetnek van egy bizonyos fejléckészlete, amely egy bizonyos sorrendben jelenik meg, amikor a WCF generálja. A mintarendszer a várttól függően szétválasztja az üzenetet. Ha sikeres, inicializál egy MessageHeaders objektumot az XML elemzése nélkül. Ha nem, akkor visszaesik a standard módszerhez.

MTOM-kódolás

Az MtomMessageEncodingBindingElement osztályhoz tartozik egy további konfigurációs tulajdonság, az úgynevezett MaxBufferSize. Ez felső határt helyez arra nézve, hogy mennyi adat pufferelhető az üzenet olvasása során. Előfordulhat, hogy az XML-információkészletet (Infoset) vagy más MIME-részeket pufferelni kell az összes MIME-rész egyetlen üzenetbe való újraépítéséhez.

A HTTP megfelelő használatához a belső MTOM üzenetkódoló osztály belső API-kat GetContentType biztosít (amelyek szintén belsőek), és WriteMessageamelyek nyilvánosak, és felülírhatók. További kommunikációra van szükség annak biztosításához, hogy a HTTP-fejlécek értékei megegyeznek a MIME-fejlécek értékeivel.

Az MTOM-üzenetkódoló belsőleg a WCF szövegolvasóját használja, és hasonló a Szövegkódolóhoz. A fő különbség az, hogy a bináris vagy a "Bináris nagy objektumok" (BLOB-ok) nagy adattömbeit optimalizálja azáltal, hogy nem konvertálja őket Base-64 kódolásra, mielőtt beágyazódtak volna az üzenet bájtjaiba. Ehelyett ezeket a BLOB-okat a rendszer kinyeri, és MIME-mellékletként hivatkozik gombra.

Saját kódoló írása

Saját egyéni üzenetkódoló implementálásához az alábbi absztrakt alaposztályok egyéni implementációit kell megadnia:

Az üzenet memórián belüli ábrázolásából streambe írható reprezentációvá alakítása az MessageEncoder osztályba van ágyazva, amely az XML-olvasók és XML-írók gyáraként szolgál, amelyek támogatják az XML-kódolások bizonyos típusait.

Az ezekben a metódusokban írt kód kezeli a szabványos átviteli protokoll és a testreszabott kódolás közötti átalakítást.

Ezután egy gyári osztályt kell kódolnia, amely létrehozza az egyéni kódolót. Felülbírálja az Encoder egyéni MessageEncoderpéldány visszaadásához.

Ezután csatlakoztassa az egyénit MessageEncoderFactory a szolgáltatás vagy ügyfél konfigurálásához használt kötéselem-veremhez úgy, hogy felülírja a metódust a CreateMessageEncoderFactory gyár egy példányának visszaadásához.

A WCF-ben két minta található, amelyek mintakóddal szemléltetik ezt a folyamatot: Custom Message Encoder: Custom Text Encoder és Custom Message Encoder: Compression Encoder.

Lásd még