Aracılığıyla paylaş


Özel Kodlayıcılar

Bu konuda özel kodlayıcıların nasıl oluşturulacağı açıklanır.

Windows Communication Foundation'da (WCF), uç noktalar arasında ağ üzerinden veri aktarımını belirtmek için bağlama kullanırsınız. Bağlama, bir dizi bağlama öğesinden oluşur. Bağlama, güvenlik, gerekli bir İleti Kodlayıcı bağlama öğesi ve gerekli aktarım bağlama öğesi gibi isteğe bağlı protokol bağlama öğelerini içerir. İleti kodlayıcı, bir ileti kodlama bağlama öğesiyle temsil edilir. WCF'ye üç ileti kodlayıcısı dahildir: İkili, İleti İletimi İyileştirme Mekanizması (MTOM) ve Metin.

İleti kodlama bağlama öğesi giden bir Message öğeyi seri hale getirerek aktarıma geçirir veya iletinin serileştirilmiş biçimini aktarımdan alır ve varsa protokol katmanına veya yoksa uygulamaya geçirir.

İleti kodlayıcıları, örnekleri kablo gösterimine ve temsilinden dönüştürür Message . Kodlayıcılar kanal yığınındaki aktarım katmanının üzerinde yer alır olarak tanımlansa da, aktarım katmanının içinde bulunurlar. Aktarımlar (örneğin HTTP), iletinin aktarım standardının gereksinimlerine göre biçimlendirilir. Kodlayıcılar (örneğin Metin Xml'i) yalnızca iletiyi kodlar.

Önceden var olan bir istemciye veya sunucuya bağlanırken, belirli bir ileti kodlaması kullanma seçeneğiniz olmayabilir. Ancak WCF hizmetleri, her birinin farklı bir ileti kodlayıcıya sahip olduğu birden çok uç nokta üzerinden erişilebilir hale getirilebilir. Tek bir kodlayıcı hizmetiniz için hedef kitlenin tamamını kapsamadığında hizmetinizi birden çok uç nokta üzerinden kullanıma sunmanız önerilir. İstemci uygulamaları daha sonra kendileri için en uygun uç noktayı seçebilir. Birden çok uç nokta kullanmak, farklı ileti kodlayıcılarının avantajlarını diğer bağlama öğeleriyle birleştirmenizi sağlar.

Sistem Tarafından Sağlanan Kodlayıcılar

WCF, en yaygın uygulama senaryolarını kapsayacak şekilde tasarlanmış, sistem tarafından sağlanan çeşitli bağlamalar sağlar. Bu bağlamaların her biri bir aktarım, ileti kodlayıcı ve diğer seçenekleri (örneğin güvenlik) birleştirir. Bu konuda, WCF'ye dahil edilen Text, Binaryve MTOM ileti kodlayıcılarını genişletme veya kendi özel kodlayıcınızı oluşturma açıklanmaktadır. Metin iletisi kodlayıcısı hem düz XML kodlamasını hem de SOAP kodlamalarını destekler. Metin iletisi kodlayıcının düz XML kodlama modu, bunu metin tabanlı SOAP kodlamasından ayırmak için POX ("Düz Eski XML") kodlayıcı olarak adlandırılır.

Sistem tarafından sağlanan bağlamalar tarafından sağlanan bağlama öğelerinin birleşimleri hakkında daha fazla bilgi için Aktarım Seçme bölümündeki ilgili bölüme bakın.

Sistem Tarafından Sağlanan Kodlayıcılarla Çalışma

bir kodlama, öğesinden MessageEncodingBindingElementtüretilen bir sınıf kullanılarak bağlamaya eklenir.

WCF, metin, ikili ve İleti İletim İyileştirme Mekanizması (MTOM) kodlaması sağlayabilen sınıfından MessageEncodingBindingElement türetilen aşağıdaki bağlama öğesi türlerini sağlar:

  • TextMessageEncodingBindingElement: XML iletileri için en çok birlikte çalışabilen ancak en az verimli kodlayıcıdır. Web hizmeti veya Web hizmeti istemcisi genellikle metin xml'sini anlayabilir. Ancak, büyük ikili veri bloklarını metin olarak iletmek verimli değildir.

  • BinaryMessageEncodingBindingElement: İkili tabanlı XML iletileri için kullanılan karakter kodlamasını ve ileti sürümü oluşturmayı belirten bağlama öğesini temsil eder. Bu, yalnızca WCF uç noktaları tarafından desteklendiğinden kodlama seçeneklerinin en verimlisi ancak en az birlikte çalışabilen seçenektir.

  • MtomMessageEncodingBindingElement: İleti İletimi İyileştirme Mekanizması (MTOM) kodlaması kullanan bir ileti için kullanılan karakter kodlamasını ve ileti sürümü oluşturmayı belirten bağlama öğesini temsil eder. MTOM, WCF iletilerinde ikili verileri iletmek için verimli bir teknolojidir. MTOM kodlayıcı, verimlilik ve birlikte çalışabilirlik arasında denge kurmaya çalışır. MTOM kodlaması çoğu XML'yi metin biçiminde iletir, ancak büyük ikili veri bloklarını metne dönüştürmeden olduğu gibi ileterek iyileştirir.

Bağlama öğesi bir ikili, MTOM veya metin MessageEncoderFactoryoluşturur. Fabrika ikili, MTOM veya metin MessageEncoderFactory örneği oluşturur. Genellikle tek bir örnek vardır. Ancak oturumlar kullanılırsa, her oturum için farklı bir kodlayıcı sağlanabilir. İkili kodlayıcı, dinamik sözlükleri koordine etmek için bunu kullanır (bkz. XML Altyapısı).

ReadMessage ve WriteMessage yöntemleri kodlayıcıların çekirdeğidir. Yöntemler, bir akıştan veya diziden Byte bir iletinin okunmasını sağlar. Bayt dizileri, aktarım arabelleğe alınan modda çalışırken kullanılır. İletiler her zaman akışlara yazılır. Aktarım, iletiyi arabelleğe alması gerekiyorsa, arabelleği oluşturan bir akış sağlar.

Üyelerin geri kalanı destek içeriği, medya türleri ve MessageVersionile çalışır. Aktarım, gelen iletinin kodunun çözülip çözülemeyeceğini test etmek veya giden iletinin bu kodlayıcı için geçerli olup olmadığını belirlemek için bu kodlayıcı yöntemlerini çağırır.

Üç kodlayıcı uygulamasının her biri, belirli kodlamalarla ilgili özellikler ekler ve tam olarak yapılandırılabilir. Kodlayıcılar ayrıca güvenli varsayılanlara sahip okuyucu kotalarını da kullanıma sunar. Kotalarla ilgili bir tartışma için bkz. XML Altyapısı.

Sistem Tarafından Sağlanan Kodlayıcıların Özellikleri

Sistem tarafından sağlanan kodlayıcılar tarafından sağlanan bir dizi özellik vardır.

Biriktirme

Kodlayıcı uygulamalarının her biri mümkün olduğunca havuza almaya çalışır. Ayırmaları azaltmak, yönetilen kodun performansını geliştirmenin önemli bir yoludur. Bu havuzu gerçekleştirmek için uygulamalar sınıfını SynchronizedPool kullanır. C# dosyası, bu sınıf tarafından kullanılan ek iyileştirmelerin açıklamasını içerir.

XmlDictionaryReader ve XmlDictionaryWriter örnekleri, her ileti için yenilerini ayırmayı önlemek için havuza alınmış ve yeniden başlatılmış durumdadır. Okuyucular için geri çağırma, OnClose çağrıldığında Close() okuyucuyu geri alır. Kodlayıcı, iletileri oluştururken kullanılan bazı ileti durumu nesnelerini de geri dönüşüme döndürür. Bu havuzların boyutları, 'den MessageEncodingBindingElementtüretilen üç sınıfın her birinde ve MaxWritePoolSize özellikleri tarafından MaxReadPoolSize yapılandırılabilir.

İkili Kodlama

İkili kodlama oturumları kullandığında, dinamik sözlük dizesi iletinin alıcısına iletilmelidir. Bu işlem, iletiye dinamik sözlük dizelerinin ön ekini eklenerek yapılır. Alıcı dizeleri siler, bunları oturuma ekler ve iletiyi işler. Sözlük dizelerinin doğru geçirilmesi, aktarımın arabelleğe alınması gerekir.

Dizeler, bir iç AddSessionInformationToMessage yöntem tarafından iletiye eklenir. Dizeleri, iletinin önüne uzunlukları ön ekli UTF-8 olarak ekler. Daha sonra tüm sözlük üst bilgisi, verilerinin uzunluğuyla önek olarak eklenir. Ters işlem bir iç ExtractSessionInformationFromMessage yöntem tarafından gerçekleştirilir.

Dinamik sözlük anahtarlarını işlemeye ek olarak, arabelleğe alınmış oturumlu iletiler benzersiz bir şekilde alınır. İkili kodlayıcı, belge üzerinde bir okuyucu oluşturup işlemek yerine ikili akışın yapısını çözmek için iç MessagePatterns sınıfını kullanır. Fikir, çoğu iletinin WCF tarafından oluşturulurken belirli bir sırada görünen belirli bir üst bilgi kümesine sahip olmasıdır. Desen sistemi, iletiyi beklediğine göre ayırır. Başarılı olursa, XML ayrıştırmadan bir MessageHeaders nesne başlatır. Aksi takdirde standart yönteme geri döner.

MTOM Kodlama

sınıfı adlı MtomMessageEncodingBindingElementMaxBufferSizeek bir yapılandırma özelliğine sahiptir. Bu, ileti okuma işlemi sırasında arabelleğe almasına izin verilen veri miktarına bir üst sınır yerleştirir. TÜM MIME bölümlerini tek bir iletide yeniden bir araya getirmek için XML Bilgi Kümesi (Infoset) veya diğer MIME bölümlerinin arabelleğe alınması gerekebilir.

HTTP ile doğru şekilde çalışmak için iç MTOM ileti kodlayıcı sınıfı, genel olan ve WriteMessagegeçersiz kılınabilen ve için GetContentType bazı iç API'ler (aynı zamanda iç api'lerdir) sağlar. HTTP üst bilgilerindeki değerlerin MIME üst bilgilerindeki değerlerle aynı olduğundan emin olmak için daha fazla iletişim gerçekleşmelidir.

MTOM ileti kodlayıcısı dahili olarak WCF'nin metin okuyucularını kullanır ve Metin kodlayıcıya benzer. Temel fark, ileti baytlarına eklenmeden önce bunları Base-64 kodlamasına dönüştürmeyerek büyük ikili öbekleri veya "İkili Büyük Nesneler" (BLOB) iyileştirmesidir. Bunun yerine, bu BLOB'lar ayıklanır ve MIME ekleri olarak başvurulur.

Kendi Kodlayıcınızı yazma

Kendi özel ileti kodlayıcınızı uygulamak için aşağıdaki soyut temel sınıfların özel uygulamalarını sağlamanız gerekir:

bir iletinin bellek içi gösteriminden akışa yazılabilen bir gösterime dönüştürülmesi, xml okuyucuları ve xml yazarları için belirli XML kodlama türlerini destekleyen bir fabrika işlevi görür sınıfı içinde MessageEncoder kapsüllenmiştir.

Standart aktarım protokolü ile özelleştirilmiş kodlamanız arasındaki dönüştürmeyi işleyen bu yöntemlere yazdığınız koddur.

Ardından özel kodlayıcınızı oluşturan bir fabrika sınıfını kodlamanız gerekir. Encoder özel MessageEncoderörneğinizi döndürmek için öğesini geçersiz kılın.

Ardından bu fabrikanın bir örneğini döndürmek için yöntemini geçersiz kılarak özel MessageEncoderFactory öğenizi hizmeti veya istemciyi CreateMessageEncoderFactory yapılandırmak için kullanılan bağlama öğesi yığınına bağlayın.

WcF ile sağlanan ve bu işlemi örnek kodla gösteren iki örnek vardır: Özel İleti Kodlayıcı: Özel Metin Kodlayıcı ve Özel İleti Kodlayıcı: Sıkıştırma Kodlayıcı.

Ayrıca bkz.