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 konu başlığında kanalların sahip olduğu durumlar ve geçişler, kanal durumlarını yapılandırmak için kullanılan türler ve bunların nasıl uygulanılacağı açıklanır.
Durum Makineleri ve Kanallar
İletişimle ilgilenen nesneler, örneğin soketler, genellikle ağ kaynaklarını ayırma, bağlantı kurma veya kabul etme, bağlantıları kapatma ve iletişimi sonlandırma ile ilgili durum geçişleri içeren bir durum makinesi sergiler. Kanal durumu makinesi, iletişim nesnesinin temel alınan uygulamasını soyutlayan durumlarının tekdüzen bir modelini sağlar. Arabirim ICommunicationObject bir durum kümesi, durum geçiş yöntemleri ve durum geçiş olayları sağlar. Tüm kanallar, kanal fabrikaları ve kanal dinleyicileri kanal durum makinesini uygular.
Kapandı, Kapatılıyor, Arızalı, Açıldı ve Açılıyor olayları, durum geçişi gerçekleştikten sonra dış gözlemciye bildirir.
Abort, Close ve Open yöntemleri (ve bunların zaman uyumsuz eşdeğerleri) durum geçişlerine neden olur.
state özelliği tarafından CommunicationStatetanımlanan geçerli durumu döndürür:
ICommunicationObject, CommunicationObject ve Durumlar ve Durum Geçişi
, ICommunicationObject çeşitli özelliklerinin yapılandırılabildiği Oluşturuldu durumunda başlar. Açıldı durumundan sonra, nesne ileti göndermek ve almak için kullanılabilir ancak özellikleri sabit olarak kabul edilir. Kapatma durumundan sonra nesne artık yeni gönderme veya alma isteklerini işleyemez, ancak mevcut isteklerin Kapatma zaman aşımına ulaşılana kadar tamamlanma şansı olur. Kurtarılamaz bir hata oluşursa, nesne hata hakkında bilgi için incelenip sonunda kapatılabilen Hatalı durumuna geçirilir. Kapalı durumdayken nesne temelde durum makinesinin sonuna ulaşmıştır. Bir nesne bir durumdan diğerine geçtiğinde önceki duruma geri dönmez.
Aşağıdaki diyagramda ICommunicationObject durum ve durum geçişleri gösterilmektedir. Durum geçişleri üç yöntemden birinin çağrılmasından kaynaklanabilir: Abort, Open veya Close. Bunlara uygulamaya özgü diğer yöntemlerin çağrılması da neden olabilir. Hatalı duruma geçiş, iletişim nesnesini açarken veya açtıktan sonra oluşan hataların bir sonucu olarak gerçekleşebilir.
Her ICommunicationObject şey Oluşturuldu durumunda başlar. Bu durumda, bir uygulama özelliklerini ayarlayarak nesneyi yapılandırabilir. Bir nesne, "Oluşturuldu" durumu dışında başka bir durumda olduğunda, sabit kabul edilir.
Şekil 1. ICommunicationObject Durum Makinesi.
Windows Communication Foundation (WCF), CommunicationObject ve kanal durum makinesini uygulayan ICommunicationObject adlı soyut bir temel sınıf sağlar. Aşağıdaki grafik, CommunicationObject'ya özgü değiştirilmiş bir durum diyagramıdır. Durum makinesine ICommunicationObject ek olarak, ek CommunicationObject yöntemlerin çağrıldığı zamanlamayı gösterir.
Şekil 2. ICommunicationObject durum makinesinin, olaylara ve korumalı yöntemlere yapılan çağrıları içeren CommunicationObject uygulaması.
ICommunicationObject Olayları
CommunicationObject tarafından ICommunicationObject tanımlanan beş olayı sunuyor. Bu olaylar, durum geçişlerinin bildirilmesi için iletişim nesnesini kullanan kodlar için tasarlanmıştır. Yukarıdaki Şekil 2'de gösterildiği gibi, nesnenin durumu olay tarafından adlandırılan duruma geçtikten sonra her olay bir kez tetiklenir. Beş olayın tümü de EventHandler şu şekilde tanımlanan türdedir:
public delegate void EventHandler(object sender, EventArgs e);
CommunicationObject uygulamasında, gönderen ya CommunicationObject'in kendisi ya da CommunicationObject yapıcı fonksiyonuna gönderici olarak geçirilen argümandır (eğer bu yapıcı fonksiyon aşırı yüklemesi kullanıldıysa). EventArgs parametresi eher zaman EventArgs.Emptyşeklindedir.
Türetilmiş Nesne Geri Çağırmaları
Beş olaya ek olarak, CommunicationObject türetilmiş bir nesnenin durum geçişleri gerçekleşmeden önce ve sonra çağrılmasına izin vermek için tasarlanmış sekiz korumalı sanal yöntem bildirir.
CommunicationObject.Open ve CommunicationObject.Close yöntemleri, her biriyle ilişkili üç tür geri çağırmaya sahiptir. Örneğin, CommunicationObject.Open karşılık gelen CommunicationObject.OnOpening, CommunicationObject.OnOpen ve CommunicationObject.OnOpened bulunur. ile CommunicationObject.Close ilişkilendirilmiş olan CommunicationObject.OnClose, CommunicationObject.OnClosingve CommunicationObject.OnClosed yöntemleridir.
Benzer şekilde, CommunicationObject.Abort methoduna karşılık gelen bir CommunicationObject.OnAbort vardır.
CommunicationObject.OnOpen, CommunicationObject.OnCloseve CommunicationObject.OnAbort varsayılan uygulaması olmasa da, diğer geri çağırmaların durum makinesi doğruluğu için gerekli olan varsayılan bir uygulaması vardır. Bu yöntemleri geçersiz kılarsanız temel uygulamayı çağırdığınızdan veya doğru şekilde değiştirdiğinizden emin olun.
CommunicationObject.OnOpening CommunicationObject.OnClosing ve CommunicationObject.OnFaulted karşılık gelen CommunicationObject.Openingve CommunicationObject.ClosingCommunicationObject.Faulted olaylarını tetikler. CommunicationObject.OnOpened ve CommunicationObject.OnClosed nesne durumunu sırasıyla Açık ve Kapalı olarak ayarlayın, ardından karşılık gelen CommunicationObject.Opened ve CommunicationObject.Closed olaylarını tetikleyin.
Durum Geçiş Yöntemleri
CommunicationObject Abort, Close ve Open uygulamalarını sağlar. Ayrıca, Hatalı duruma bir durum geçişi neden olan bir Hata yöntemi sağlar. Şekil 2'de, her geçişe neden olan yöntemle etiketlenmiş durum makinesi gösterilmektedir ICommunicationObject (etiketlenmemiş geçişler, son etiketli geçişe neden olan yöntemin uygulamasında gerçekleşir).
Uyarı
İletişim durumu için tüm CommunicationObject uygulamaları, iş parçacığı ile senkronize edilmiştir.
Yapıcı
CommunicationObject üç oluşturucu sağlar ve bunların tümü nesneyi Oluşturuldu durumunda bırakır. Oluşturucular şöyle tanımlanır:
İlk oluşturucu, bir nesneyi alan oluşturucu aşırı yüklemesine temsilcilik eden parametresiz bir oluşturucudur:
protected CommunicationObject() : this(new object()) { … }
Bir nesneyi alan oluşturucu, iletişim nesnesi durumuna erişimi eşitlerken kilitlenecek nesne olarak bu parametreyi kullanır:
protected CommunicationObject(object mutex) { … }
Son olarak, üçüncü bir oluşturucu, olaylar tetiklendiğinde ICommunicationObject nesnesiyle gönderen bağımsız değişkeni olarak kullanılan ek bir parametre alır.
protected CommunicationObject(object mutex, object eventSender) { … }
Önceki iki oluşturucu göndereni buna ayarlamıştı.
Açık Yöntem
Önkoşul: Durum Oluşturuldu.
Son durum: Durum Açık veya Arızalı. İstisna fırlatabilir.
Open() yöntemi, iletişim nesnesini açmaya çalışır ve durumu Açık olarak ayarlar. Hatayla karşılaşırsa durumu Hatalı olarak ayarlar.
yöntemi önce geçerli durumun Oluşturuldu olup olmadığını denetler. Geçerli durum Açılıyor veya Açıldı ise, bir InvalidOperationException fırlatır. Geçerli durum Kapatılıyor veya Kapatıldı ise, nesne sonlandırıldıysa bir CommunicationObjectAbortedException atar, aksi takdirde ObjectDisposedException atar. Geçerli durum hatalı ise, bir CommunicationObjectFaultedException fırlatır.
Ardından durumu Opening olarak ayarlar ve OnOpening() (Açılış olayını yükseltir), OnOpen() ve OnOpened() öğesini bu sırayla çağırır. OnOpened() durumu Opened olarak ayarlar ve Opened olayını başlatır. Bunlardan herhangi biri özel durum oluşturursa, Open(), Fault() öğesini çağırır ve özel durumun kabarcık oluşturmasına izin verir. Aşağıdaki diyagramda Açma işlemi daha ayrıntılı olarak gösterilmektedir.
İç iletişim nesnesini açma gibi özel açık mantık uygulamak için OnOpen yöntemini geçersiz kılın.
Close Yöntemi
Önkoşul: Yok.
Son koşul: Durum Kapalıdır. İstisna fırlatabilir.
Close() yöntemi herhangi bir durumda çağrılabilir. Nesneyi normal şekilde kapatmaya çalışır. Bir hatayla karşılaşılırsa, nesnesi sonlandırılır. Yöntem, geçerli durum Kapatılıyor veya Kapatıldı ise hiçbir şey yapmaz. Aksi takdirde, durumu Kapatılıyor olarak ayarlar. Özgün durum Oluşturuldu, Açılıyor veya Hatalı ise Abort() çağrısı yapar (aşağıdaki diyagrama bakın). Orijinal durum Açıldı ise, sırasıyla OnClosing() (Closing olayını tetikler), OnClose() ve OnClosed() fonksiyonlarını çağırır. Bunlardan herhangi biri bir istisna fırlatırsa, Close() Abort() işlevini çağırır ve istisnanın yayılmasına izin verir. OnClosed() durumu Kapalı olarak ayarlar ve Closed olayını tetikler. Aşağıdaki diyagramda Kapat işlemi daha ayrıntılı olarak gösterilmektedir.
Bir iç iletişim nesnesini kapatma gibi özel kapatma mantığı uygulamak için OnClose yöntemini geçersiz kılın. Uzun süre engelleyebilecek tüm nazik kapatma mantığı OnClose() içinde uygulanmalıdır; çünkü bir zaman aşımı parametresi alır ve Abort() parçası olarak çağrılmaz. Örneğin, diğer tarafın yanıt vermesini beklemek gibi durumlar buna dahildir.
İptal
Önkoşul: Yok.
Son koşul: Durum Kapalıdır. İstisna fırlatabilir.
Geçerli durum Kapalı olduğunda veya nesne daha önce sonlandırıldıysa (örneğin, başka bir iş parçacığında Abort() yürütülerek) Abort() yöntemi hiçbir şey yapmaz. Aksi takdirde, durumu Kapanış olarak ayarlar ve OnClosing() (Closing olayını yükseltir), OnAbort() ve OnClosed()'i bu sırayla çağırır (çünkü nesne kapatılmak yerine sonlandırılıyor, OnClose'u çağırmaz). OnClosed() durumu Kapalı olarak ayarlar ve Closed olayını tetikler. Bunlardan herhangi biri bir istisna fırlatırsa, Abort'u çağırana yeniden fırlatılır. OnClosing(), OnClosed() ve OnAbort() uygulamalarının blokaj yapmaması gerekir (örneğin, giriş/çıkış işlemlerinde). Aşağıdaki diyagramda İptal işlemi daha ayrıntılı olarak gösterilmektedir.
İç iletişim nesnesini sonlandırma gibi özel sonlandırma mantığı uygulamak için OnAbort yöntemini geçersiz kılın.
Hata
Fault yöntemi, CommunicationObject öğesine özgüdür ve ICommunicationObject arabiriminin bir parçası değildir. Tamlık için buraya dahildir.
Önkoşul: Yok.
Son koşul: Durum Hatalı. İstisna fırlatabilir.
Geçerli durum Hatalı veya Kapalı olduğunda Fault() yöntemi hiçbir şey yapmaz. Aksi takdirde durumu Faulted olarak ayarlar ve OnFaulted() öğesini çağırarak Faulted olayını tetikler. OnFaulted bir özel durum oluşturursa, bu durum yeniden fırlatılır.
ThrowIfXxx Yöntemleri
CommunicationObject, nesne belirli bir durumdaysa istisnalar oluşturmak için kullanılabilecek üç korunan yönteme sahiptir.
ThrowIfDisposed Durum Kapatılıyor, Kapatıldı veya Hatalı ise bir özel durum oluşturur.
ThrowIfDisposedOrImmutable durum Oluşturuldu değilse bir istisna fırlatır.
ThrowIfDisposedOrNotOpen durum Açık değilse bir istisna fırlatır.
Atılan istisnalar duruma bağlıdır. Aşağıdaki tabloda farklı durumlar ve o durumda ThrowIfXxx çağrılarak atılan ilgili özel durum türü gösterilmektedir.
| Devlet | Abort çağrıldı mı? | İstisna |
|---|---|---|
| Oluşturuldu | Mevcut Değil | System.InvalidOperationException |
| Açılış | Mevcut Değil | System.InvalidOperationException |
| Açıldı | Mevcut Değil | System.InvalidOperationException |
| Kapanış | Evet | System.ServiceModel.CommunicationObjectAbortedException |
| Kapanış | Hayı | System.ObjectDisposedException |
| Kapalı | Evet | System.ServiceModel.CommunicationObjectAbortedException bir nesne, önceden yapılan açık bir Abort çağrısı ile kapatılmışsa. Nesnede Close çağrısı yaparsanız bir System.ObjectDisposedException fırlatılır. |
| Kapalı | Hayı | System.ObjectDisposedException |
| Hatalı | Mevcut Değil | System.ServiceModel.CommunicationObjectFaultedException |
Zaman aşımı süreleri
Ele aldığımız yöntemlerin birkaçı zaman aşımı parametrelerini alır. Bunlar Close, Open (belirli aşırı yüklemeler ve zaman uyumsuz sürümler), OnClose ve OnOpen'dır. Bu yöntemler, uzun işlemlere (örneğin, bir bağlantıyı düzgün bir şekilde kapatırken giriş/çıkışta engelleme) izin verecek şekilde tasarlanmıştır, böylece zaman aşımı parametresi bu işlemlerin kesintiye uğramadan önce ne kadar sürebileceğini gösterir. Bu yöntemlerden herhangi birinin uygulamaları, bu zaman aşımı içinde çağırana geri döndüğünden emin olmak için sağlanan zaman aşımı değerini kullanmalıdır. Zaman aşımı almayan diğer yöntemlerin uygulamaları, uzun işlemler için tasarlanmamıştır ve giriş/çıkış işlemlerinde bloke etmemelidir.
Özel durum, zaman aşımına neden olmayan Open() ve Close() aşırı yüklemeleridir. Bunlar türetilmiş sınıf tarafından sağlanan varsayılan bir zaman aşımı değeri kullanır. CommunicationObject isimli DefaultCloseTimeout ve DefaultOpenTimeout olarak tanımlanan iki soyut korumalı özelliği ortaya çıkarır:
protected abstract TimeSpan DefaultCloseTimeout { get; }
protected abstract TimeSpan DefaultOpenTimeout { get; }
Türetilmiş bir sınıf, bir zaman aşımı değeri almayan Open() ve Close() aşırı yüklemeleri için varsayılan zaman aşımını sağlamak üzere bu özellikleri uygular. Ardından, Open() ve Close() uygulamaları varsayılan zaman aşımı değerini kullanarak zaman aşımlı bir aşırı yükleme alan işlevi delege eder, örneğin:
public void Open()
{
this.Open(this.DefaultOpenTimeout);
}
IDefaultCommunicationTimeouts
Bu arabirim, açma, gönderme, alma ve kapatma için varsayılan zaman aşımı değerleri sağlamaya yönelik dört salt okunur özelliğe sahiptir. Her uygulama, varsayılan değerleri uygun şekilde almaktan sorumludur. Kolaylık sağlamak için, ChannelFactoryBase ve ChannelListenerBase bu değerleri varsayılan olarak her biri 1 dakika olarak ayarlar.