Aracılığıyla paylaş


İleti Değişimi Deseni Seçme

Özel aktarım yazmanın ilk adımı, geliştirmekte olduğunuz kanal için hangi ileti değişimi desenlerinin (veya MEP'lerin) gerekli olduğuna karar vermektir. Bu konu, kullanılabilir seçenekleri açıklar ve çeşitli gereksinimleri ele alır. Bu, Kanal Geliştirme bölümünde açıklanan kanal geliştirme görev listesindeki ilk görevdir.

Altı Mesajlaşma Desenleri

Aralarından seçim yapabileceğiniz üç MEP vardır:

  • Veri Grubu (IInputChannel ve IOutputChannel)

    Bir veri birimi MEP'i kullanırken, istemci ateşle ve unut yöntemiyle bir mesaj gönderir ve yanıt beklemez. Ateş ve unutma değişimi, bant dışı başarılı teslimat onayı gerektiren bir işlemdir. İleti aktarım sırasında kaybolabilir ve hizmete hiç ulaşmayabilir. gönderme işlemi istemci ucunda başarıyla tamamlanırsa, uzak uç noktanın iletiyi aldığını garanti etmez. Datagram, güvenilir protokoller ve güvenli protokoller de dahil olmak üzere üzerine kendi protokollerinizi inşa edebileceğiniz için mesajlaşma için temel bir yapı taşıdır. İstemci datagram kanalları IOutputChannel arabirimini uygular ve hizmet datagram kanalları IInputChannel arabirimini uygular.

  • Request-Response (IRequestChannel ve IReplyChannel)

    Bu MEP'te bir ileti gönderilir ve bir yanıt alınır. Desen, istek-yanıt çiftlerinden oluşur. İstek yanıt çağrılarına örnek olarak uzaktan yordam çağrıları (RPC) ve tarayıcı GET istekleri verilebilir. Bu desen yarı çift yönlü olarak da bilinir. Bu MEP'te istemci kanalları IRequestChannel, hizmet kanalları ise IReplyChannel uygular.

  • Çift yönlü (IDuplexChannel)

    Çift yönlü MEP, bir istemcinin rastgele sayıda mesaj göndermesine ve bunları herhangi bir sırayla almasına olanak tanır. Çift yönlü MEP, konuşulan her sözcüğün bir ileti olduğu bir telefon konuşması gibidir. Her iki tarafın bu MEP'te gönderip alabilmesi nedeniyle, istemci ve hizmet kanalları tarafından uygulanan arabirim IDuplexChannel'dir.

Üç temel ileti değişimi desenini gösteren akış çizelgesi
Üç temel ileti değişimi deseni. Yukarıdan aşağıya: veri birimi, istek yanıtı ve çift yönlü.

Bu MEP'lerin her biri oturumları da destekleyebilir. Oturum (ve System.ServiceModel.Channels.ISessionChannel<TSession> türünde System.ServiceModel.Channels.ISession uygulanması) bir kanalda gönderilen ve alınan tüm iletileri birbirine bağlar. İstek ve yanıt bağıntılı olduğundan istek-yanıt düzeni tek başına iki iletili bir oturumdur. Buna karşılık, oturumları destekleyen istek-yanıt deseni, bu kanaldaki tüm istek/yanıt çiftlerinin birbiriyle ilişkili olduğunu gösterir. Bu size aralarından seçim yapabileceğiniz toplam altı MEP verir:

  • Datagram

  • İstek yanıtı

  • Dubleks

  • Oturumlar içeren veri birimi

  • Oturumlarla istek-yanıt

  • Çift yönlü iletişim oturumları

Uyarı

UDP aktarımı için desteklenen tek MEP veri birimidir çünkü UDP doğal olarak bir yangın ve unutma protokolüdür.

Oturumlar ve Oturum İçerikli Kanallar

Ağ dünyasında, bağlantı odaklı protokoller (örneğin, TCP) ve bağlantısız protokoller (örneğin UDP) vardır. WCF, bağlantı benzeri mantıksal soyutlama anlamına gelen oturum terimini kullanır. Oturumlu WCF protokolleri, bağlantı odaklı ağ protokollerine ve oturumsuz WCF protokolleri de bağlantısız ağ protokollerine benzer.

Kanal nesne modelinde her mantıksal oturum, oturumlu kanalın bir örneği olarak bildirimde bulunur. Bu nedenle, istemci tarafından oluşturulan ve hizmette kabul edilen her yeni oturum, her iki tarafta yeni bir oturum açma kanalına karşılık gelir. Aşağıdaki diyagramda üst kısımda oturumsuz kanalların yapısı ve alt kısımda oturumlu kanalların yapısı gösterilmektedir.

Oturumsuz ve oturumlu kanalların yapısını gösteren akış çizelgesi

İstemci yeni bir oturumlu kanal oluşturur ve bir ileti gönderir. Hizmet tarafında, kanal dinleyicisi bu iletiyi alır ve yeni bir oturuma ait olduğunu algılar, böylece yeni bir oturumlu kanal oluşturur ve uygulamayı uygulamaya (kanal dinleyicisinde AcceptChannel'i çağıran uygulamaya yanıt olarak) iletir. Uygulama daha sonra bu iletiyi ve sonraki tüm iletileri aynı oturumlu kanal üzerinden aynı oturumda alır.

Başka bir istemci (veya aynı istemci) yeni bir oturumlu oluşturur ve bir ileti gönderir. Kanal dinleyicisi bu iletinin yeni bir oturumda olduğunu algılar ve yeni bir oturumlu kanal oluşturur ve işlem yinelenir.

Oturumlar olmadan, kanallar ve oturumlar arasında bağıntı olmaz. Bu nedenle kanal dinleyicisi, alınan tüm iletilerin uygulamaya teslim olduğu tek bir kanal oluşturur. Oturum olmadığından, ileti sırası da korunmaz ve bu nedenle ileti sıralaması yoktur. Önceki grafiğin üst kısmında oturumsuz ileti değişimi gösterilir.

Oturumları Başlatma ve Sonlandırma

Oturumlar istemcide yalnızca yeni bir oturumlu kanal oluşturularak başlatılır. Yeni bir oturumda gönderilen bir ileti hizmete ulaştığında, onlar hizmette başlatılır. Benzer şekilde oturumlar, oturumlu bir kanalı kapatarak veya durdurarak sonlandırılır.

Bunun istisnası, IDuplexSessionChannel çift yönlü, oturumlu bir iletişim düzeninde ileti göndermek ve almak için kullanılır. Bir tarafın ileti göndermeyi durdurmak istemesi ancak ileti almaya devam etmesi mümkündür. Bu nedenle kullanırken IDuplexSessionChannel , daha fazla ileti göndermeyeceğini ancak giriş oturumunu açık tutarak iletileri almaya devam etmenizi sağlayan çıkış oturumunu kapatmanıza olanak tanıyan bir mekanizma vardır.

Oturumlar genel olarak gelen tarafta değil, giden tarafta kapatılır. Başka bir ifadeyle, oturumlu çıkış kanalları kapatılabilir ve böylece oturumu temiz bir şekilde sonlandırabilirsiniz. Oturumlu bir çıkış kanalının kapatılması, üzerinde IInputChannel.Receive çağrısı yapan uygulamaya ilgili oturumlu giriş kanalının null döndürmesine IDuplexSessionChannel neden olur.

Ancak IInputChannel.Receive üzerinde IDuplexSessionChannel null döndürdüğünde, oturumun zaten kapalı olduğunu belirttiğinden, oturumlu giriş kanalları kapatılmamalıdır. Eğer IInputChannel.Receive üzerindeki IDuplexSessionChannel null döndürmediyse, oturumlu giriş kanalı kapatılırken beklenmeyen iletiler alabileceği için bir hata meydana gelebilir. Alıcı, bir oturumu gönderenden önce sonlandırmak isterse, oturumu aniden sonlandıran giriş kanalını çağırmalıdır Abort .

Oturumlu Kanalları Geliştirme

Oturumlu bir kanal oluşturucu olarak, kanalınızın oturum sağlamak için yapması gereken birkaç şey bulunur. Gönderme tarafında kanalınızın şunları yapması gerekir:

  • Her yeni kanal için yeni bir oturum oluşturun ve bunu benzersiz bir dize olan yeni bir oturum kimliğiyle ilişkilendirin. Ya da yığının altındaki oturumlu kanaldan yeni bir oturum edinin.

  • Bu kanal kullanılarak gönderilen her ileti için, kanalınız oturumu oluşturduysa (aşağıdaki katmandan almak yerine), iletiyi oturumla ilişkilendirmeniz gerekir. Protokol kanalları için bu genellikle bir SOAP üst bilgisi eklenerek yapılır. Aktarım kanalları için bu genellikle yeni bir aktarım bağlantısı oluşturarak veya çerçeve protokolüne oturum bilgileri ekleyerek yapılır.

  • Bu kanal kullanılarak gönderilen her ileti için yukarıda belirtilen teslimat garantilerini sağlamanız gerekir. Oturumu sağlamak için aşağıdaki kanala güveniyorsanız, bu kanal teslimat garantilerini de sağlar. Oturumu kendiniz sağlıyorsanız, bu garantileri protokolünüzün bir parçası olarak uygulamanız gerekir. Genel olarak, her iki tarafta da WCF olduğunu varsayan bir protokol kanalı yazıyorsanız TCP aktarımını veya Reliable Messaging kanalını gerekli kılabilir ve oturum sağlamak için bunlardan birine güvenebilirsiniz.

  • Kanalınızda ICommunicationObject.Close çağrıldığında, belirtilen zaman aşımını veya varsayılan zaman aşımını kullanarak oturumu kapatmak için gerekli işi yapın. Bu, sizin aşağıdaki kanalla Close çağrıda bulunmanız (oturumu ondan yeni aldıysanız), özel bir SOAP iletisi göndermeniz veya bir taşıma bağlantısını kapatmanız kadar basit olabilir.

  • Abort kanalınızda çağrıldığında, G/Ç gerçekleştirmeden oturumu aniden sonlandırın. Bu, hiçbir şey yapmamak anlamına gelebilir veya ağ bağlantısını veya başka bir kaynağı durdurmayı içerebilir.

Alma tarafında kanalınızın şunları yapması gerekir:

  • Gelen her ileti için kanal dinleyicisinin ait olduğu oturumu algılaması gerekir. Bu oturumdaki ilk iletiyse, kanal dinleyicisinin yeni bir kanal oluşturması ve çağrıdan döndürmesi gerekir IChannelListener<TChannel>.AcceptChannel. Aksi takdirde kanal dinleyicisinin oturuma karşılık gelen mevcut kanalı bulması ve iletiyi bu kanal üzerinden teslim etmesi gerekir.

  • Kanalınız oturumu sağlıyorsa (gerekli teslim garantileriyle birlikte) alma tarafının mesajları yeniden sıralamak veya onay göndermek gibi bazı eylemleri gerçekleştirmesi gerekebilir.

  • Kanalınızda Close çağrıldığında, oturumu ya belirtilen zaman aşımını ya da varsayılan zaman aşımını kullanarak kapatmak için gerekli işlemleri yürütün. Bu durum, kanalın kapalı zaman aşımının süresinin dolması beklenirken bir ileti alması durumunda özel durumlarla sonuçlanabilir. Bunun nedeni, kanal bir mesaj aldığında Kapatılıyor durumunda olacağı için bir hata verebilir.

  • Abort kanalınızda çağrıldığında, G/Ç gerçekleştirmeden oturumu aniden sonlandırın. Bu da hiçbir şey yapmamak anlamına gelebilir veya ağ bağlantısını veya başka bir kaynağı durdurmayı içerebilir.

Ayrıca bakınız