Aracılığıyla paylaş


Windows Communication Foundation'da (WCF) hata işleme

Bir hizmet beklenmeyen bir özel durum veya hatayla karşılaştığında, özel durum işleme çözümü tasarlamanın birden çok yolu vardır. Tek bir "doğru" veya "en iyi yöntem" hata işleme çözümü olmasa da, dikkate alınması gereken birden çok geçerli yol vardır. Normalde, WCF uygulamasının karmaşıklığı, özel durumların türü ve sıklığı, özel durumların işlenmemiş doğası ve ilişkili izleme, günlüğe kaydetme veya ilke gereksinimlerine bağlı olarak aşağıdaki listeden birden çok yaklaşımı birleştiren bir karma çözüm uygulanması önerilir.

Bu çözümler, bu bölümün geri kalanında daha ayrıntılı olarak açıklanmıştır.

The Microsoft Enterprise Library

Microsoft Enterprise Library Özel Durum İşleme Uygulama Bloğu, ortak tasarım desenlerinin uygulanmasına ve kurumsal uygulamanın tüm mimari katmanlarında oluşan özel durumları işlemek için tutarlı bir strateji oluşturulmasına yardımcı olur. Uygulama bileşenlerindeki catch deyimlerinde bulunan tipik kodu destekleyecek şekilde tasarlanmıştır. Bu kodu (özel durum bilgilerini günlüğe kaydeden kod gibi) uygulama genelinde aynı catch bloklarında yinelemek yerine, Özel Durum İşleme Uygulama Bloğu geliştiricilerin bu mantığı yeniden kullanılabilir özel durum işleyicileri olarak kapsüllemesini sağlar.

Bu Kitaplık kullanıma sunulan bir Hata Sözleşmesi Özel Durum İşleyicisi içerir. Bu özel durum işleyicisi WCF hizmet sınırlarında kullanılmak üzere tasarlanmıştır ve özel durumdan yeni bir Hata Sözleşmesi oluşturur.

Uygulama blokları, yaygın olarak kullanılan en iyi yöntemleri birleştirir ve uygulamanız genelinde özel durum işleme için ortak bir yaklaşım sağlar. Öte yandan, kendi başına geliştirilen özel hata işleyicileri ve hata sözleşmeleri de çok yararlı olabilir. Örneğin, özel hata işleyicileri tüm özel durumları otomatik olarak FaultExceptions'a yükseltmek ve ayrıca uygulamanıza günlüğe kaydetme özellikleri eklemek için mükemmel bir fırsat sağlar.

Daha fazla bilgi için bkz . Microsoft Enterprise Library.

Beklenen özel durumlarla ilgilenme

Doğru eylem, her işlemde veya ilgili genişletilebilirlik noktasında beklenen özel durumları yakalamak, bunların kurtarılıp kurtarılamayacağına karar vermek ve Bir FaultException<T'de> uygun özel hatayı döndürmektir.

IErrorHandler kullanarak beklenmeyen özel durumlarla ilgilenme

Beklenmeyen özel durumlarla başa çıkmak için önerilen eylem, bir IErrorHandler'ı "bağlamaktır". Hata işleyicileri yalnızca WCF çalışma zamanı düzeyinde ("hizmet modeli" katmanı) özel durumları yakalar, kanal katmanında yakalamaz. IErrorHandler'ı kanal düzeyinde bağlamanın tek yolu, çoğu senaryoda önerilmeyen özel bir kanal oluşturmaktır.

"Beklenmeyen özel durum" genellikle ne geri alınamaz bir özel durumdur ne de bir işleme özel durumudur; bunun yerine beklenmeyen bir kullanıcı özel durumudur. Genellikle Hizmet Modeli Özel Durum İşleyicisi tarafından otomatik olarak işlenen kurtarılabilir bir özel durum (bellek dışı özel durum gibi) genellikle düzgün işlenemez ve böyle bir özel durumu işlemenin tek nedeni ek günlük kaydı yapmak veya istemciye standart bir özel durum döndürmek olabilir. bir işleme özel durumu, örneğin serileştirme, kodlayıcı veya biçimlendirici düzeyinde iletinin işlenmesinde oluşur; genellikle bir IErrorHandler'da işlenemez, çünkü genellikle hata işleyicisinin bu özel durumların oluştuğu zamana kadar müdahalesi çok erken veya çok geç olur. Benzer şekilde, aktarım özel durumları bir IErrorHandler'da işlenemez.

IErrorHandler ile özel durum oluştuğunda uygulamanızın davranışını açıkça denetleyebilirsiniz. Şu durumlarda:

  1. İstemciye hata gönderip göndermemeye karar verin.

  2. Özel durumu hatayla değiştirin.

  3. Bir hatayı başka bir hatayla değiştirin.

  4. Günlüğe kaydetme veya izleme gerçekleştirme.

  5. Diğer özel etkinlikleri gerçekleştirin.

Hizmetiniz için kanal dağıtıcılarının ErrorHandlers özelliğine ekleyerek özel bir hata işleyicisi yükleyebilirsiniz. Birden fazla hata işleyicisi olması mümkündür ve bunlar bu koleksiyona eklendikleri sırayla çağrılır.

IErrorHandler.ProvideFault, istemciye gönderilen hata iletisini denetler. Bu yöntem, hizmetinizdeki bir işlem tarafından oluşan özel durumun türünden bağımsız olarak çağrılır. Burada hiçbir işlem gerçekleştirilmezse, WCF varsayılan davranışını varsayar ve hiçbir özel hata işleyicisi yokmuş gibi devam eder.

Özel durumları istemciye gönderilmeden önce hatalara dönüştürmek için merkezi bir yer oluşturmak istediğinizde (örneğin atılmadığından ve kanalın Hatalı durumuna taşınmadığından emin olmak) bu yaklaşımı kullanabilirsiniz.

IErrorHandler.HandleError yöntemi genellikle hata günlüğü, sistem bildirimleri, uygulamayı kapatma gibi hatayla ilgili davranışları uygulamak için kullanılır. IErrorHandler.HandleError, hizmetin içinde birden çok yerde çağrılabilir ve hatanın oluştuğu yere bağlı olarak HandleError yöntemi işlemle aynı iş parçacığı tarafından çağrılabilir veya çağrılamayabilir; bu konuda hiçbir garanti verilmemektedir.

WCF dışındaki özel durumlarla ilgilenme

Genellikle, yapılandırma özel durumları, veritabanı bağlantı dizesi özel durumları ve diğer benzer özel durumlar bir WCF uygulaması bağlamında ortaya çıkabilir, ancak bunlar hizmet modelinin veya web hizmetinin kendisinden kaynaklanan özel durumlar değildir. Bu özel durumlar, web hizmetinin dışındaki "normal" özel durumlardır ve ortamdaki diğer dış özel durumlar gibi işlenmelidir.

İzleme özel durumları

İzleme, tüm özel durumları görme olasılığı olan tek "tümünü yakala" yerdir. İzleme ve günlüğe kaydetme özel durumları hakkında daha fazla bilgi için bkz. İzleme ve Günlüğe Kaydetme.

WebGetAttribute ve WebInvokeAttribute kullanılırken URI şablonu hataları

WebGet ve WebInvoke öznitelikleri, istek adresinin bileşenlerini işlem parametrelerine eşleyen bir URI şablonu belirtmenize olanak tanır. Örneğin, "weather/{state}/{city}" URI şablonu istek adresini değişmez belirteçlere, state adlı parametreye ve city adlı parametreye eşler. Bu parametreler daha sonra işlemin bazı resmi parametrelerine ada bağlı olabilir.

Şablon parametreleri URI içindeki dizeler biçiminde görünürken, yazılan bir sözleşmenin resmi parametreleri dize olmayan türlerde olabilir. Bu nedenle, işlemin çağrılabilmesi için önce bir dönüştürmenin gerçekleşmesi gerekir. Dönüştürme biçimleri tablosu kullanılabilir.

Ancak dönüştürme başarısız olursa, işlemin bir sorun olduğunu bilmesinin hiçbir yolu yoktur. Bunun yerine tür dönüştürmesi, dağıtım hatası biçiminde ortaya çıkar.

Bir tür dönüştürme dağıtım hatası, bir hata işleyicisi yüklenerek diğer birçok dağıtım hatası türüyle aynı şekilde incelenebilir. Hizmet düzeyi özel durumlarını işlemek için IErrorHandler genişletilebilirlik noktası çağrılır. Buradan, çağırana geri gönderilecek yanıt (özel görevleri ve raporlamayı gerçekleştirmenin yanı sıra) seçilebilir.

Ayrıca bkz.