Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı, Message örneklerini kablo temsiline dönüştürür ve bu temsilden geri çevirir. 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.
System-Provided 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.
System-Provided Kodlayıcılarla Çalışma
Bir kodlama, MessageEncodingBindingElement öğesinden türetilen bir sınıf kullanılarak bir bağlamaya eklenir.
WCF, metin, ikili ve İleti İletim İyileştirme Mekanizması (MTOM) kodlamasını sağlayabilen MessageEncodingBindingElement sınıfından türetilmiş aşağıdaki bağlayıcı eleman 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 as-isileterek 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ğe alan 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ı.
System-Provided Kodlayıcıların Özellikleri
Sistem tarafından sağlanan kodlayıcıların sunduğu bir dizi özellik vardır.
Biriktirme
Kodlayıcı uygulamalarının her biri mümkün olduğunca birleştirmeye çalışır. Ayırmaları azaltmak, yönetilen kodun performansını geliştirmenin önemli bir yoludur. Bu havuzu oluşturmak için uygulamalar SynchronizedPool sınıfını 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 amacıyla havuzlanır ve yeniden başlatılır. Okuyucular için, OnClose geri çağırma, Close() çağrıldığında okuyucuyu geri kazanı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ı, MaxReadPoolSize'den türetilen üç sınıfın her birinde MaxWritePoolSize ve MessageEncodingBindingElement özellikleri ile 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 ayıklar, bunları oturum sırasında ekler ve iletiyi işler. Sözlük dizelerinin doğru bir şekilde geçirilebilmesi için taşıma işleminin arabelleğe alınması gereklidir.
Dizeler, bir iç AddSessionInformationToMessage yöntem tarafından iletiye eklenir. Mesajın önüne, uzunluklarıyla birlikte ön ek olan UTF-8 dizeleri ekler. Daha sonra tüm sözlük başlığı, verilerinin uzunluğu ile öneklenir. 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ış ve oturumla ilişkili 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. Amaç, çoğu iletinin WCF tarafından oluşturulduğunda belirli bir sırada görünen belirli bir üst bilgi kümesine sahip olmasıdır. Desen sistemi, mesajı kendi beklentilerine göre parçalar. Başarılı olursa, XML'i ayrıştırmadan bir MessageHeaders nesnesi başlatır. Aksi takdirde standart yönteme geri döner.
MTOM Kodlaması
MtomMessageEncodingBindingElement sınıfı, MaxBufferSize adlı ek bir yapılandırma özelliğine sahiptir. İleti okuma işlemi sırasında arabelleğe alınmasına izin verilen veri miktarına bir üst sınır koyar. 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 mesaj kodlayıcı sınıfı, GetContentType için bazı dahili API'ler sağlar (ki bunlar da dahili), ve WriteMessage için, genel olup geçersiz kılınabilen bazı API'ler 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, büyük ikili verileri veya "İkili Büyük Nesneler" (BLOB) ileti baytlarına eklenmeden önce Base-64 kodlamasına dönüştürmeyerek, bunları optimize etmesidir. Bunun yerine, bu BLOB'lar çıkarılır ve MIME ekleri olarak referans verilir.
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:
Bellek içi gösterimden akışa yazılabilen bir mesaj gösterimine dönüştürme işlemi, belirli XML kodlama türlerini destekleyen XML okuyucuları ve XML yazarları için bir fabrika işlevi gören MessageEncoder sınıfı içinde kapsüllenmiştir.
Bu sınıfın geçersiz kılmanız gereken temel yöntemleri şunlardır:
WriteMessage bir MessageEncodingBindingElement nesnesini alır ve bir Stream nesnesine yazar.
ReadMessage bir Stream nesnesi ve maksimum üst bilgi boyutunu alır ve bir Message nesnesi döndürür.
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. Özel Encoder örneğinizi döndürmek için MessageEncoder'ı geçersiz kılın.
Ardından MessageEncoderFactory yöntemini geçersiz kılarak bu fabrikanın bir örneğini döndüren özel CreateMessageEncoderFactory öğenizi, hizmeti veya istemciyi 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ı.