İleti Kodlayıcı Seçme
Bu makalede, Windows Communication Foundation'a (WCF) dahil edilen ileti kodlayıcıları arasında seçim yapmak için ölçütler ele alınmaktadır: ikili, metin ve İleti İletimi İyileştirme Mekanizması (MTOM).
WCF'de, bir dizi bağlama öğesinden oluşan bağlama yoluyla uç noktalar arasında bir ağ üzerinden veri aktarımını belirtirsiniz. İleti kodlayıcı, bağlama yığınındaki bir ileti kodlama bağlama öğesiyle temsil edilir. Bağlama, güvenlik bağlama öğesi veya güvenilir mesajlaşma bağlama öğesi, gerekli ileti kodlama bağlama öğesi ve gerekli aktarım bağlama öğesi gibi isteğe bağlı protokol bağlama öğelerini içerir.
İleti kodlama bağlama öğesi, isteğe bağlı protokol bağlama öğelerinin altında ve gerekli aktarım bağlama öğesinin üzerinde yer alır. Giden tarafında, bir ileti kodlayıcı gideni Message seri hale getirerek aktarıma geçirir. Gelen tarafında, ileti kodlayıcı aktarımdan serileştirilmiş bir Message biçimini alır ve varsa daha yüksek protokol katmanına veya değilse uygulamaya geçirir.
Önceden var olan bir istemciye veya sunucuya bağlanırken, iletilerinizi diğer tarafın beklediği şekilde kodlamanız gerektiğinden belirli bir ileti kodlaması kullanma seçeneğiniz olmayabilir. Ancak, bir WCF hizmeti yazıyorsanız, hizmetinizi her birinin farklı bir ileti kodlaması kullanarak birden çok uç nokta üzerinden kullanıma sunmanız gerekir. Bu, istemcilerin kendi için en iyi uç nokta üzerinden hizmetinizle konuşmak için en iyi kodlamayı seçmesine ve ayrıca müşterilerinize kendileri için en iyi kodlamayı seçme esnekliği vermesine olanak tanır. Birden çok uç nokta kullanmak, farklı ileti kodlamalarının avantajlarını diğer bağlama öğeleriyle birleştirmenizi de sağlar.
Sistem Tarafından Sağlanan Kodlayıcılar
WCF, aşağıdaki üç sınıf tarafından temsil edilen üç ileti kodlayıcı içerir:
TextMessageEncodingBindingElement, metin iletisi kodlayıcı, hem düz XML kodlamasını hem de SOAP kodlamasını destekler. Metin iletisi kodlayıcının düz XML kodlama modu, metin tabanlı SOAP kodlamasından ayırt etmek için "düz eski XML" (POX) olarak adlandırılır. POX'ı etkinleştirmek için özelliğini olarak NoneayarlayınMessageVersion. WCF olmayan uç noktalarla birlikte çalışabilmek için metin iletisi kodlayıcısını kullanın.
BinaryMessageEncodingBindingElement, ikili ileti kodlayıcı, kompakt bir ikili biçim kullanır ve WCF ile WCF iletişimi için iyileştirilmiştir ve bu nedenle birlikte çalışamaz. Bu aynı zamanda WCF'nin sağladığı tüm kodlayıcıların en yüksek performanslı kodlayıcıdır.
MtomMessageEncodingBindingElementbağlama öğesi, MTOM kodlaması kullanan iletiler için karakter kodlamasını ve ileti sürüm oluşturmasını belirtir. MTOM, WCF iletilerinde ikili verileri iletmek için verimli bir teknolojidir. MTOM kodlayıcı, verimlilik ve birlikte çalışabilirlik arasında bir denge oluşturmaya ç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. Verimlilik açısından, WCF'nin sağladığı kodlayıcılar arasında MTOM metin (en yavaş) ile ikili (en hızlı) arasında yer alır.
İleti Kodlayıcı Seçme
Aşağıdaki tabloda, bir ileti kodlayıcı seçmek için kullanılan yaygın faktörler açıklanmaktadır. Uygulamanız için önemli olan faktörlerin önceliğini belirleyin ve ardından bu faktörlerle en iyi şekilde çalışan ileti kodlayıcılarını seçin. Bu tabloda listelenmeyen ek faktörleri ve uygulamanızda gerekli olabilecek özel ileti kodlayıcılarını dikkate almayı unutmayın.
Faktör | Açıklama | Bu faktörü destekleyen kodlayıcılar |
---|---|---|
Desteklenen Karakter Kümeleri | TextMessageEncodingBindingElement ve MtomMessageEncodingBindingElement yalnızca UTF8 ve UTF16 Unicode (big-endian ve little-endian) kodlamalarını destekler. UTF7 veya ASCII gibi başka kodlamalar gerekiyorsa, özel bir kodlayıcı kullanılmalıdır. Örnek bir özel kodlayıcı için bkz . Özel İleti Kodlayıcı. | Metin |
İnceleme | Denetleme, iletim sırasında iletileri inceleyebilme özelliğidir. SOAP kullanılarak veya kullanılmadan metin kodlamaları, özel araçlar kullanılmadan iletilerin birçok uygulama tarafından incelenmesine ve analiz edilmesine olanak tanır. aktarım güvenliğinin ileti veya aktarım düzeyinde kullanılması, iletileri inceleme yeteneğinizi etkiler. Gizlilik, bir iletinin incelenmesini engeller ve bütünlük bir iletinin değiştirilmesini engeller. | Metin |
Güvenilirlik | Güvenilirlik, bir kodlayıcının iletim hatalarına dayanıklılığıdır. Güvenilirlik ileti, aktarım veya uygulama katmanında da sağlanabilir. Tüm standart WCF kodlayıcıları, başka bir katmanın güvenilirlik sağladığını varsayar. Kodlayıcının iletim hatasından kurtulma özelliği çok azdır. | Hiçbiri |
Basitlik | Basitlik, kodlama belirtimi için kodlayıcılar ve kod çözücüler oluşturma kolaylığı sağlar. Metin kodlamaları kolaylık açısından özellikle avantajlıdır ve POX metin kodlaması, SOAP işleme için destek gerektirmeme avantajına sahiptir. | Metin (POX) |
Size | Kodlama, içeriğe uygulanan ek yük miktarını belirler. Kodlanmış iletilerin boyutu, hizmet işlemlerinin en yüksek aktarım hızıyla doğrudan ilgilidir. İkili kodlamalar genellikle metin kodlamalarından daha kompakttır. İleti boyutu premium olduğunda, kodlama sırasında ileti içeriğini sıkıştırmayı da göz önünde bulundurun. Ancak sıkıştırma, hem ileti gönderen hem de alıcı için işleme maliyetleri ekler. | İkilik |
Akışlar | Akış, uygulamaların iletinin tamamı gelmeden önce bir iletiyi işlemeye başlamasını sağlar. Akışın etkili bir şekilde kullanılması, bir iletinin önemli verilerinin iletinin başında kullanılabilir olmasını gerektirir, böylece alıcı uygulamanın gelmesini beklemesi gerekmez. Ayrıca, akışlı aktarım kullanan uygulamaların iletideki verileri artımlı olarak düzenlemesi gerekir, böylece içerikte ileri bağımlılıklar olmaz. Çoğu durumda, akış içeriği ile bu içerik için mümkün olan en küçük aktarım boyutu arasında ödün vermeniz gerekir. | Hiçbiri |
Üçüncü Taraf Araç Desteği | Kodlama için destek alanları arasında geliştirme ve tanılama yer alır. Üçüncü taraf geliştiriciler, POX biçiminde kodlanmış iletileri işlemek için kitaplıklara ve araç setlerine büyük bir yatırım yaptı. | Metin (POX) |
Birlikte çalışabilirlik | Bu faktör, WCF kodlayıcının WCF olmayan hizmetlerle birlikte çalışabilmesini ifade eder. | Metin MTOM (kısmi) |
Not: İkili Kodlayıcı kullanılırken, XMLReader oluştururken IgnoreWhitespace ayarının kullanılması hiçbir etkisi olmaz. Örneğin, bir hizmet işlemi içinde aşağıdakileri yaparsanız:
public void OperationContract(XElement input)
{
Console.WriteLine("{0}", input.Value);
int counter = 0;
var xreader = input.CreateReader();
var reader = XmlReader.Create(xreader, new XmlReaderSettings() { IgnoreWhitespace = true });
while (reader.Read())
{
counter++;
}
Console.WriteLine("Read {0} lines with reader", counter);
}
IgnoreWhitespace ayarı yoksayılır.
Sıkıştırma ve İkili Kodlayıcı
WCF 4.5'le başlayarak WCF ikili kodlayıcı sıkıştırma desteği ekler. Bu, wcf istemcisinden sıkıştırılmış iletiler göndermek için gzip/deflate algoritmasını kullanmanıza ve şirket içinde barındırılan bir WCF hizmetinden sıkıştırılmış iletilerle yanıt vermenizi sağlar. Bu özellik hem HTTP hem de TCP aktarımlarında sıkıştırmayı etkinleştirir. IIS'de barındırılan bir WCF hizmeti, IIS ana bilgisayar sunucusu yapılandırılarak sıkıştırılmış yanıtlar göndermek için her zaman etkinleştirilebilir. Sıkıştırma türü özelliğiyle BinaryMessageEncodingBindingElement.CompressionFormat yapılandırılır. Bu özellik sabit listesi değerlerinden System.ServiceModel.Channels.CompressionFormat birine ayarlanır:
Bu özellik yalnızca binaryMessageEncodingBindingElement üzerinde kullanıma sunulduğundan, bu özelliği kullanmak için aşağıdaki gibi bir özel bağlama oluşturmanız gerekir:
<customBinding>
<binding name="BinaryCompressionBinding">
<binaryMessageEncoding compressionFormat ="GZip" />
<httpTransport />
</binding>
</customBinding>
Hem istemcinin hem de hizmetin sıkıştırılmış iletiler gönderip almayı kabul etmesi ve bu nedenle compressionFormat özelliğinin hem istemci hem de hizmet üzerindeki binaryMessageEncoding öğesinde yapılandırılması gerekir. Hizmet veya istemci sıkıştırma için yapılandırılmamışsa ancak diğer taraf ise ProtocolException oluşturulur. Sıkıştırmayı etkinleştirme dikkatli bir şekilde göz önünde bulundurulmalıdır. Sıkıştırma, ağ bant genişliği bir performans sorunuysa çoğunlukla yararlıdır. CPU'da performans sorunu olması durumunda sıkıştırma, aktarım hızını azaltır. Bunun uygulama açısından faydalı olup olmadığını öğrenmek için simülasyon ortamında uygun testlerin yapılması gerekir