Aracılığıyla paylaş


Özel Durum ve Hataları İşleme

Özel durumlar, hizmet veya istemci uygulaması içinde hataları yerel olarak iletmek için kullanılır. Öte yandan hatalar, sunucudan istemciye veya tersi gibi hizmet sınırları arasında hataları iletmek için kullanılır. Aktarım kanalları, hatalara ek olarak genellikle aktarım düzeyi hataları iletmek için aktarıma özgü mekanizmalar kullanır. Örneğin, HTTP aktarımı mevcut olmayan bir uç nokta URL'sini (hata geri göndermek için uç nokta yoktur) iletmek için 404 gibi durum kodlarını kullanır. Bu belge, özel kanal yazarlarına rehberlik sağlayan üç bölümden oluşur. İlk bölümde, özel durumların ne zaman ve nasıl tanımlanacağı ve nasıl atılacağını gösteren yönergeler sağlanır. İkinci bölüm, hata oluşturma ve kullanma konusunda rehberlik sağlar. Üçüncü bölümde, çalışan uygulamalarda sorun giderme konusunda özel kanalınızın kullanıcısına yardımcı olmak için izleme bilgilerinin nasıl sağlanmaları açıklanır.

Özel durumlar

Özel durum oluştururken göz önünde bulundurulması gereken iki şey vardır: İlk olarak, kullanıcıların özel duruma uygun şekilde tepki verebilen doğru kod yazmasına olanak tanıyan bir türde olması gerekir. İkincisi, kullanıcının neyin yanlış gittiğini, hata etkisini ve nasıl düzeltileceğini anlaması için yeterli bilgi sağlaması gerekir. Aşağıdaki bölümler, Windows Communication Foundation (WCF) kanalları için özel durum türleri ve iletileriyle ilgili yönergeler sağlar. Özel Durumlar için Tasarım Yönergeleri belgesinde .NET'teki özel durumlarla ilgili genel yönergeler de vardır.

Özel Durum Türleri

Kanallar tarafından oluşan tüm özel durumlar bir System.TimeoutException, System.ServiceModel.CommunicationExceptionveya türünden CommunicationExceptiontüretilmiş olmalıdır. (Gibi ObjectDisposedException özel durumlar da oluşturulabilir, ancak yalnızca çağıran kodun kanalı kötüye kullandığını belirtmek için. Bir kanal doğru şekilde kullanılıyorsa, yalnızca belirli özel durumları oluşturması gerekir.) WCF, kanallardan CommunicationException türetilen ve kanallar tarafından kullanılmak üzere tasarlanmış yedi özel durum türü sağlar. Sistemin diğer bölümleri tarafından kullanılmak üzere tasarlanmış başka CommunicationExceptiontüretilmiş özel durumlar vardır. Bu özel durum türleri şunlardır:

Özel Durum Türü Anlamı İç Özel Durum İçeriği Kurtarma Stratejisi
AddressAlreadyInUseException Dinleme için belirtilen uç nokta adresi zaten kullanımda. Varsa, bu özel duruma neden olan aktarım hatası hakkında daha fazla ayrıntı sağlar. Örneğin. PipeException, HttpListenerExceptionveya SocketException. Farklı bir adres deneyin.
AddressAccessDeniedException İşleme dinleme için belirtilen uç nokta adresine erişim izni verilmiyor. Varsa, bu özel duruma neden olan aktarım hatası hakkında daha fazla ayrıntı sağlar. Örneğin, PipeExceptionveya HttpListenerException. Farklı kimlik bilgileriyle deneyin.
CommunicationObjectFaultedException ICommunicationObject Kullanılan hata durumundadır (daha fazla bilgi için bkz. Durum Değişikliklerini Anlama). Birden çok bekleyen çağrıya sahip bir nesne Hatalı durumuna geçtiğinde, yalnızca bir çağrının hatayla ilgili bir özel durum oluşturduğunu ve çağrıların geri kalanının bir CommunicationObjectFaultedExceptionoluşturduğunu unutmayın. Bu özel durum genellikle bir uygulamanın bazı özel durumlara göz yummasından ve büyük olasılıkla özgün özel durumu yakalayandan başka bir iş parçacığında zaten hatalı bir nesne kullanmaya çalışması nedeniyle oluşur. Varsa, iç özel durum hakkında ayrıntılar sağlar. Yeni bir nesne oluşturur. Hataya ICommunicationObject neyin neden olduğuna bağlı olarak, kurtarmak için gereken başka çalışmalar olabileceğini unutmayın.
CommunicationObjectAbortedException ICommunicationObject Kullanılan durduruldu (daha fazla bilgi için bkz. Durum Değişikliklerini Anlama). benzer şekilde CommunicationObjectFaultedException, bu özel durum uygulamanın büyük olasılıkla başka bir iş parçacığından nesne üzerinde çağırdığını Abort ve bu nedenle nesnenin artık kullanılamadığını gösterir. Varsa, iç özel durum hakkında ayrıntılar sağlar. Yeni bir nesne oluşturur. durdurma işleminin ICommunicationObject ilk etapta neden olduğuna bağlı olarak, kurtarmak için gereken başka çalışmalar da olabileceğini unutmayın.
EndpointNotFoundException Hedef uzak uç nokta dinlemiyor. Bu, uç nokta adresinin herhangi bir bölümünün yanlış, çözümlenemez veya uç noktanın devre dışı olmasından kaynaklanabilir. Örnek olarak DNS hatası, Kuyruk Yöneticisi kullanılamıyor ve hizmet çalışmıyor. İç özel durum, genellikle temel alınan aktarımdan ayrıntıları sağlar. Farklı bir adres deneyin. Alternatif olarak, gönderen bir süre bekleyebilir ve hizmetin devre dışı olması durumunda yeniden deneyebilir
ProtocolException Uç noktanın ilkesinde açıklandığı gibi iletişim protokolleri, uç noktalar arasında uyumsuzdur. Örneğin, çerçeve içerik türü uyuşmazlığı veya maksimum ileti boyutu aşıldı. Varsa, belirli bir protokol hatası hakkında daha fazla bilgi sağlar. Örneğin, QuotaExceededException hata nedeni MaxReceivedMessageSize değerini aştığında iç özel durumdur. Kurtarma: Gönderen ve alınan protokol ayarlarının eşleştiğinden emin olun. Bunu gerçekleştirmenin bir yolu, hizmet uç noktasının meta verilerini (ilkesi) yeniden içeri aktarmak ve oluşturulan bağlamayı kullanarak kanalı yeniden oluşturmaktır.
ServerTooBusyException Uzak uç nokta dinliyor ancak iletileri işlemeye hazır değil. Varsa, iç Özel Durum SOAP hatası veya aktarım düzeyi hata ayrıntılarını sağlar. Kurtarma: Bekleyin ve işlemi daha sonra yeniden deneyin.
TimeoutException İşlem zaman aşımı süresi içinde tamamlanamadı. Zaman aşımıyla ilgili ayrıntıları sağlayabilir. Bekleyin ve işlemi daha sonra yeniden deneyin.

Yeni bir özel durum türü tanımlamanın tek farkı, bu tür mevcut özel durum türlerinin tümünden farklı belirli bir kurtarma stratejisine karşılık geliyorsa. Yeni bir özel durum türü tanımlarsanız, bunun türetilmiş sınıflarından CommunicationException veya sınıflarından birinden türetilmiş olması gerekir.

Özel Durum İletileri

Özel durum iletileri, kullanıcının sorunu anlamasına ve çözmesine yardımcı olmak için yeterli bilgi sağlamaları için programı değil kullanıcıyı hedefler. İyi bir özel durum iletisinin üç temel bölümü şunlardır:

Olan şeyleri ifade eder. Kullanıcının deneyimiyle ilgili terimleri kullanarak sorunun net bir açıklamasını sağlayın. Örneğin, hatalı bir özel durum iletisi "Geçersiz yapılandırma bölümü" olabilir. Bu, kullanıcının hangi yapılandırma bölümünün yanlış olduğunu ve neden yanlış olduğunu merak eder. Geliştirilmiş bir ileti "Geçersiz yapılandırma bölümü <customBinding>" olabilir. Daha da iyi bir ileti "bağlamada zaten myTransport adlı bir aktarım olduğundan myBinding adlı bağlamaya myTransport adlı aktarım eklenemiyor" olabilir. Bu, kullanıcının uygulamanın yapılandırma dosyasında kolayca tanımlayabildiği terimleri ve adları kullanan çok özel bir iletidir. Ancak, hala birkaç önemli bileşen eksik.

Hatanın önemi. İletide hatanın ne anlama geldiğini açıkça belirtmedikçe, kullanıcı bunun önemli bir hata olup olmadığını veya yoksayılıp yoksayılamayacağını merak eder. Genel olarak, iletiler hatanın anlamı veya önemi ile yol açmalıdır. Önceki örneği geliştirmek için, "ServiceHost bir yapılandırma hatası nedeniyle Açılamadı: Bağlamada zaten myTransport adlı bir aktarım olduğundan myBinding adlı bağlamaya myTransport adlı aktarım eklenemiyor" iletisi olabilir.

Kullanıcının sorunu nasıl düzeltmesi gerektiği. İletinin en önemli kısmı, kullanıcının sorunu düzeltmesine yardımcı olmaktır. İleti, sorunu çözmek için nelerin denetlenmesi veya düzeltilmesi gerektiği hakkında bazı yönergeler veya ipuçları içermelidir. Örneğin, "ServiceHost bir yapılandırma hatası nedeniyle Açılamadı: Bağlamada zaten myTransport adlı bir aktarım olduğundan myBinding adlı bağlamaya myTransport adlı aktarım eklenemiyor. Lütfen bağlamada yalnızca bir taşıma olduğundan emin olun".

Hataları İletişime Alma

SOAP 1.1 ve SOAP 1.2 her ikisi de hatalar için belirli bir yapı tanımlar. İki belirtim arasında bazı farklar vardır, ancak genel olarak Message ve MessageFault türleri hataları oluşturmak ve kullanmak için kullanılır.

SOAP 1.2 Fault and SOAP 1.1 Fault
SOAP 1.2 Hatası (sol) ve SOAP 1.1 Hatası (sağ). SOAP 1.1'de yalnızca Fault öğesi ad alanı nitelenmiş.

SOAP, hata iletisini yalnızca bir hata öğesini (adı <env:Fault>olan bir öğe) öğesinin <env:Body>alt öğesi olarak içeren bir ileti olarak tanımlar. Hata öğesinin içeriği, şekil 1'de gösterildiği gibi SOAP 1.1 ile SOAP 1.2 arasında biraz farklılık gösterir. Ancak, System.ServiceModel.Channels.MessageFault sınıfı bu farkları tek bir nesne modelinde normalleştirir:

public abstract class MessageFault  
{  
    protected MessageFault();  
  
    public virtual string Actor { get; }  
    public virtual string Node { get; }  
    public static string DefaultAction { get; }  
    public abstract FaultCode Code { get; }  
    public abstract bool HasDetail { get; }  
    public abstract FaultReason Reason { get; }  
  
    public T GetDetail<T>();  
    public T GetDetail<T>( XmlObjectSerializer serializer);  
    public System.Xml.XmlDictionaryReader GetReaderAtDetailContents();  
  
    // other methods omitted  
}  

Code özelliği, (veya faultCode SOAP 1.1'de) öğesine karşılık gelir env:Code ve hatanın türünü tanımlar. SOAP 1.2, için faultCode beş izin verilen değeri (örneğin, Gönderen ve Alıcı) tanımlar ve herhangi bir alt kod değeri içerebilen bir Subcode öğe tanımlar. (Bkz.İzin verilebilen hata kodları listesi ve anlamları için SOAP 1.2 belirtimi.) SOAP 1.1'in biraz farklı bir mekanizması vardır: Tamamen yenilerini tanımlayarak veya nokta gösterimini kullanarak genişletilebilen faultCodesdört faultCode değeri (örneğin, İstemci ve Sunucu) tanımlar. Örneğin, Client.Authentication.

Hataları programlamak için MessageFault kullandığınızda, FaultCode.Name ve FaultCode.Namespace, SOAP 1.2 env:Code veya SOAP 1.1'in faultCodeadı ve ad alanıyla eşler. FaultCode.SubCode, SOAP 1.2 için ile eşler env:Subcode ve SOAP 1.1 için null değeridir.

Bir hatayı program aracılığıyla ayırt etmek ilginçse yeni hata alt kodları (veya SOAP 1.1 kullanıyorsanız yeni hata kodları) oluşturmanız gerekir. Bu, yeni bir özel durum türü oluşturmaya benzer. DOT gösterimini SOAP 1.1 hata kodlarıyla kullanmaktan kaçınmalısınız. (WS-I Temel Profili ayrıca hata kodu nokta gösteriminin kullanılmasını da önerilmez.)

public class FaultCode  
{  
    public FaultCode(string name);  
    public FaultCode(string name, FaultCode subCode);  
    public FaultCode(string name, string ns);  
    public FaultCode(string name, string ns, FaultCode subCode);  
  
    public bool IsPredefinedFault { get; }  
    public bool IsReceiverFault { get; }  
    public bool IsSenderFault { get; }  
    public string Name { get; }  
    public string Namespace { get; }  
    public FaultCode SubCode { get; }  
  
//  methods omitted  
  
}  

özelliği, Reason bir özel durumun iletisine env:Reason benzer hata koşulunun insan tarafından okunabilen açıklamasına (veya faultString SOAP 1.1'de) karşılık gelir. sınıfı FaultReason (ve SOAP env:Reason/faultString), genelleştirme açısından birden çok çeviriye sahip olmak için yerleşik desteğe sahiptir.

public class FaultReason  
{  
    public FaultReason(FaultReasonText translation);  
    public FaultReason(IEnumerable<FaultReasonText> translations);  
    public FaultReason(string text);  
  
    public SynchronizedReadOnlyCollection<FaultReasonText> Translations
    {
       get;
    }  
  
 }  

Hata ayrıntı içeriği, T> ve GetReaderAtDetailContents() gibi GetDetail<çeşitli yöntemler kullanılarak MessageFault'ta kullanıma sunulur. Hata ayrıntısı, hata hakkında ek ayrıntı taşımaya yönelik opak bir elemandır. Hatayla birlikte taşımak istediğiniz rastgele yapılandırılmış bazı ayrıntılar varsa, bu yararlı olur.

Hata Oluşturma

Bu bölümde, kanalda veya kanal tarafından oluşturulan ileti özelliğinde algılanan bir hata koşuluna yanıt olarak hata oluşturma işlemi açıklanmaktadır. Tipik bir örnek, geçersiz veri içeren bir istek iletisine yanıt olarak hatanın geri gönderilmesidir.

Hata oluştururken, özel kanal hatayı doğrudan göndermemelidir, bunun yerine bir özel durum oluşturmalı ve yukarıdaki katmanın bu özel durumu bir hataya dönüştürip dönüştürmeyeceğine ve nasıl göndereceğine karar vermesine izin vermelidir. Bu dönüştürmeye yardımcı olmak için kanal, özel kanal tarafından oluşan özel durumu uygun hataya dönüştürebilen bir FaultConverter uygulama sağlamalıdır. FaultConverter şu şekilde tanımlanır:

public class FaultConverter  
{  
    public static FaultConverter GetDefaultFaultConverter(  
                                   MessageVersion version);  
    protected abstract bool OnTryCreateFaultMessage(  
                                   Exception exception,
                                   out Message message);  
    public bool TryCreateFaultMessage(  
                                   Exception exception,
                                   out Message message);  
}  

Özel hatalar oluşturan her kanalın uygulaması ve çağrısından döndürmesi GetProperty<FaultConverter>gerekirFaultConverter. Özel OnTryCreateFaultMessage uygulamanın özel durumu bir hataya dönüştürmesi veya iç kanalın FaultConvertertemsilcisi olması gerekir. Kanal bir aktarımsa, özel durumu dönüştürmeli veya kodlayıcıya FaultConverter veya WCF'de sağlanan varsayılan FaultConverter değere temsilci vermelidir. Varsayılan değer FaultConverter , WS-Addressing ve SOAP tarafından belirtilen hata iletilerine karşılık gelen hataları dönüştürür. Örnek bir OnTryCreateFaultMessage uygulama aşağıda verilmiştir.

public override bool OnTryCreateFaultMessage(Exception exception,
                                             out Message message)  
{  
    if (exception is ...)  
    {  
        message = ...;  
        return true;  
    }  
  
#if IMPLEMENTING_TRANSPORT_CHANNEL  
    FaultConverter encoderConverter =
                    this.encoder.GetProperty<FaultConverter>();  
    if ((encoderConverter != null) &&
        (encoderConverter.TryCreateFaultMessage(  
         exception, out message)))  
    {  
        return true;  
    }  
  
    FaultConverter defaultConverter =
                   FaultConverter.GetDefaultFaultConverter(  
                   this.channel.messageVersion);  
    return defaultConverter.TryCreateFaultMessage(  
                   exception,
                   out message);  
#else  
    FaultConverter inner =
                   this.innerChannel.GetProperty<FaultConverter>();  
    if (inner != null)  
    {  
        return inner.TryCreateFaultMessage(exception, out message);  
    }  
    else  
    {  
        message = null;  
        return false;  
    }  
#endif  
}  

Bu düzenin bir etkisi, hata gerektiren hata koşulları için katmanlar arasında atılan özel durumların ilgili hata oluşturucunun doğru hatayı oluşturması için yeterli bilgi içermesi gerektiğidir. Özel kanal yazarı olarak, bu tür özel durumlar yoksa farklı hata koşullarına karşılık gelen özel durum türleri tanımlayabilirsiniz. Kanal katmanlarında geçiş yapılan özel durumların, opak hata verileri yerine hata koşulunu iletmesi gerektiğini unutmayın.

Hata Kategorileri

Genellikle üç hata kategorisi vardır:

  1. Yığının tamamı boyunca her geçen gün devam eden hatalar. Bu hatalarla kanal yığınındaki herhangi bir katmanda karşılaşılabilir, örneğin InvalidCardinalityAddressingException.

  2. Yığındaki belirli bir katmanın üzerinde herhangi bir yerde karşılaşılabilecek hatalar, örneğin akışlı bir işlemle veya güvenlik rolleriyle ilgili bazı hatalar.

  3. Yığındaki tek bir katmana yönlendirilen hatalar, örneğin WS-RM sıra numarası hataları gibi hatalar.

Kategori 1. Hatalar genellikle WS-Addressing ve SOAP hatalarıdır. WCF tarafından sağlanan temel FaultConverter sınıf, WS-Addressing ve SOAP tarafından belirtilen hata iletilerine karşılık gelen hataları dönüştürür, böylece bu özel durumların dönüştürülmesini kendiniz işlemek zorunda olmazsınız.

Kategori 2. Bir katman, iletiye o katmanla ilgili ileti bilgilerini tamamen tüketmeyen bir özellik eklediğinde hatalar oluşur. Daha sonra daha yüksek bir katman ileti özelliğinden ileti bilgilerini daha fazla işlemesini istediğinde hatalar algılanabilir. Bu tür kanallar, daha yüksek katmanın GetProperty doğru hatayı geri göndermesini sağlamak için daha önce belirtileni uygulamalıdır. Bunun bir örneği TransactionMessageProperty'dir. Bu özellik, üst bilgideki tüm veriler tam olarak doğrulanmadan iletiye eklenir (bunun yapılması dağıtılmış işlem düzenleyicisine (DTC) başvurmayı içerebilir.

Kategori 3. Hatalar yalnızca işlemcideki tek bir katman tarafından oluşturulur ve gönderilir. Bu nedenle tüm özel durumlar katman içinde yer alır. Kanallar arasındaki tutarlılığı geliştirmek ve bakımı kolaylaştırmak için özel kanalınızın dahili hatalar için bile hata iletileri oluşturmak üzere daha önce belirtilen deseni kullanması gerekir.

Alınan Hataları Yorumlama

Bu bölüm, hata iletisi alınırken uygun özel durumu oluşturmaya yönelik rehberlik sağlar. Yığındaki her katmanda bir iletiyi işlemeye yönelik karar ağacı aşağıdaki gibidir:

  1. Katman iletinin geçersiz olduğunu düşünüyorsa, katman 'geçersiz ileti' işlemini yapmalıdır. Bu tür işlemler katmana özgüdür, ancak iletiyi bırakma, izleme veya hataya dönüştürülen özel durum oluşturma işlemlerini içerebilir. Düzgün bir şekilde güvenli olmayan bir iletiyi alan güvenlik veya hatalı bir sıra numarasına sahip bir ileti alan RM buna örnek olarak verilebilir.

  2. Aksi takdirde, ileti özellikle katmana uygulanan bir hata iletisiyse ve ileti katmanın etkileşimi dışında anlamlı değilse, katman hata koşulunu işlemelidir. Bunun bir örneği, RM kanalının üzerindeki katmanlar için anlamsız olan ve RM kanalının hatalı olduğunu ve bekleyen işlemlerden atıldığını gösteren RM Dizisi Reddedildi hatasıdır.

  3. Aksi takdirde, ileti Request() veya Receive() içinden döndürülmelidir. Bu, katmanın hatayı tanıdığı durumları içerir, ancak hata yalnızca bir isteğin başarısız olduğunu gösterir ve kanalın hatalı olduğunu ve bekleyen işlemlerden atıldığını göstermez. Böyle bir durumda kullanılabilirliği geliştirmek için katman, geçersiz kılarak OnTryCreateExceptionhatayı özel duruma dönüştürebilen türetilmiş bir FaultConverter sınıf uygulamalı GetProperty<FaultConverter> ve döndürmelidir.

Aşağıdaki nesne modeli iletileri özel durumlara dönüştürmeyi destekler:

public class FaultConverter  
{  
    public static FaultConverter GetDefaultFaultConverter(  
                                  MessageVersion version);  
    protected abstract bool OnTryCreateException(  
                                 Message message,
                                 MessageFault fault,
                                 out Exception exception);  
    public bool TryCreateException(  
                                 Message message,
                                 MessageFault fault,
                                 out Exception exception);  
}  

Bir kanal katmanı, hata iletilerini özel durumlara dönüştürmeyi desteklemek için uygulanabilir GetProperty<FaultConverter> . Bunu yapmak için hata iletisini geçersiz kılın OnTryCreateException ve inceleyin. Tanındıysa dönüştürmeyi yapın, aksi takdirde iç kanaldan dönüştürmesini isteyin. Varsayılan SOAP/WS-Addressing FaultConverter'ı almak için aktarım kanalları için temsilci FaultConverter.GetDefaultFaultConverter seçilmelidir.

Tipik bir uygulama şuna benzer:

public override bool OnTryCreateException(  
                            Message message,
                            MessageFault fault,
                            out Exception exception)  
{  
    if (message.Action == "...")  
    {  
        exception = ...;  
        return true;  
    }  
    // OR  
    if ((fault.Code.Name == "...") && (fault.Code.Namespace == "..."))  
    {  
        exception = ...;  
        return true;  
    }  
  
    if (fault.IsMustUnderstand)  
    {  
        if (fault.WasHeaderNotUnderstood(  
                   message.Headers, "...", "..."))  
        {  
            exception = new ProtocolException(...);  
            return true;  
        }  
    }  
  
#if IMPLEMENTING_TRANSPORT_CHANNEL  
    FaultConverter encoderConverter =
              this.encoder.GetProperty<FaultConverter>();  
    if ((encoderConverter != null) &&
        (encoderConverter.TryCreateException(  
                              message, fault, out exception)))  
    {  
        return true;  
    }  
  
    FaultConverter defaultConverter =  
             FaultConverter.GetDefaultFaultConverter(  
                             this.channel.messageVersion);  
    return defaultConverter.TryCreateException(  
                             message, fault, out exception);  
#else  
    FaultConverter inner =
                    this.innerChannel.GetProperty<FaultConverter>();  
    if (inner != null)  
    {  
        return inner.TryCreateException(message, fault, out exception);  
    }  
    else  
    {  
        exception = null;  
        return false;  
    }  
#endif  
}  

Farklı kurtarma senaryolarına sahip belirli hata koşulları için türetilmiş bir sınıfını ProtocolExceptiontanımlamayı göz önünde bulundurun.

MustUnderstand İşleme

SOAP, gerekli bir üst bilginin alıcı tarafından anlaşılmadığını belirten genel bir hata tanımlar. Bu hata, hata olarak mustUnderstand bilinir. WCF'de özel kanallar hiçbir zaman hata oluşturmaz mustUnderstand . Bunun yerine, WCF iletişim yığınının en üstünde bulunan WCF Dağıtıcısı, MustUnderstand=true olarak işaretlenmiş tüm üst bilgilerin temel yığın tarafından anlaşıldığını denetler. Herhangi biri anlaşılmadıysa, bu noktada bir mustUnderstand hata oluşturulur. (Kullanıcı bu mustUnderstand işlemeyi kapatmayı seçebilir ve uygulamanın tüm ileti üst bilgilerini almasını sağlayabilir. Bu durumda işleme gerçekleştirmek mustUnderstand uygulamanın sorumluluğundadır.) Oluşturulan hata, Anlaşılmayan MustUnderstand=true ile tüm üst bilgilerin adlarını içeren bir NotUnderstood üst bilgisi içerir.

Protokol kanalınız MustUnderstand=true ile özel bir üst bilgi gönderir ve bir mustUnderstand hata alırsa, bu hatanın gönderdiği üst bilgiden kaynaklanıp kaynaklandığını anlamalıdır. sınıfında bunun için yararlı olan iki üye MessageFault vardır:

public class MessageFault  
{  
    ...  
    public bool IsMustUnderstandFault { get; }  
    public static bool WasHeaderNotUnderstood(MessageHeaders headers,
        string name, string ns) { }  
    ...  
  
}  

IsMustUnderstandFaulthataysa mustUnderstand döndürürtrue. WasHeaderNotUnderstood belirtilen ad ve ad alanına sahip üst bilgi hataya NotUnderstood üst bilgisi olarak eklenmişse döndürür true . Aksi takdirde döndürür false.

Kanal MustUnderstand = true olarak işaretlenmiş bir üst bilgi yayarsa, bu katman Özel Durum Oluşturma API'sini de uygulamalı ve bu üst bilgiden kaynaklanan hataları daha önce açıklandığı gibi daha kullanışlı bir özel duruma dönüştürmelidir mustUnderstand .

İzleme

.NET Framework, üretim uygulamalarını veya aralıklı sorunları tanılamaya yardımcı olmak için program yürütmeyi izlemek için bir mekanizma sağlar; burada yalnızca bir hata ayıklayıcı ekleyip kodda adım adım ilerleyin. Bu mekanizmanın temel bileşenleri ad alanındadır System.Diagnostics ve şunlardan oluşur:

  • System.Diagnostics.TraceSource, yazılacak izleme bilgilerinin kaynağıdır. Bu, System.Diagnostics.TraceListeneriçinden izlenecek TraceSource bilgileri alan ve dinleyiciye özgü bir hedefe çıkış yapan somut dinleyiciler için soyut bir temel sınıftır. Örneğin, XmlWriterTraceListener izleme bilgilerini bir XML dosyasına aktarır. Son olarak, System.Diagnostics.TraceSwitchuygulama kullanıcısının izleme ayrıntı düzeyini denetlemesine olanak tanır ve genellikle yapılandırmada belirtilir.

  • Temel bileşenlere ek olarak, WCF izlemelerini görüntülemek ve aramak için Hizmet İzleme GörüntüleyiciSi Aracı'nı (SvcTraceViewer.exe) kullanabilirsiniz. Araç, WCF tarafından oluşturulan ve kullanılarak XmlWriterTraceListeneryazılan izleme dosyaları için özel olarak tasarlanmıştır. Aşağıdaki şekilde, izlemeyle ilgili çeşitli bileşenler gösterilmektedir.

Tracing components

Özel Kanaldan İzleme

Özel kanallar, çalışan uygulamaya hata ayıklayıcı eklemek mümkün olmadığında sorunları tanılamaya yardımcı olmak için izleme iletileri yazmalıdır. Bu iki üst düzey görev içerir: örneği oluşturma TraceSource ve izlemeleri yazmak için yöntemlerini çağırma.

örneğini TraceSourceoluştururken, belirttiğiniz dize bu kaynağın adı olur. Bu ad, izleme kaynağını yapılandırmak (etkinleştirme/devre dışı bırakma/izleme düzeyini ayarlama) için kullanılır. Ayrıca izleme çıkışının kendisinde de görünür. Özel kanallar, izleme çıktısı okuyucularının izleme bilgilerinin nereden geldiğini anlamasına yardımcı olmak için benzersiz bir kaynak adı kullanmalıdır. İzleme kaynağının adı olarak bilgileri yazan derlemenin adını kullanmak yaygın bir uygulamadır. Örneğin WCF, System.ServiceModel derlemesinden yazılan bilgiler için izleme kaynağı olarak System.ServiceModel kullanır.

bir izleme kaynağınız olduğunda, izleme dinleyicilerine TraceDataTraceEventizleme girdileri yazmak için , veya TraceInformation yöntemlerini çağırırsınız. Yazdığınız her izleme girdisi için, olay türünü içinde TraceEventTypetanımlanan olay türlerinden biri olarak sınıflandırmanız gerekir. Bu sınıflandırma ve yapılandırmadaki izleme düzeyi ayarı, izleme girişinin dinleyiciye çıkış olup olmadığını belirler. Örneğin, yapılandırmadaki izleme düzeyini olarak Warning ayarlamak, Error ve Critical izleme girdilerinin yazılmasına izin verirWarning, ancak Bilgi ve Ayrıntılı girdileri engeller. Aşağıda, izleme kaynağının örneğini oluşturma ve Bilgi düzeyinde bir girdi yazma örneği verilmiştir:

using System.Diagnostics;  
//...  
TraceSource udpSource = new TraceSource("Microsoft.Samples.Udp");  
//...  
udpsource.TraceInformation("UdpInputChannel received a message");  

Önemli

İzleme çıktı okuyucularının çıkışın nereden geldiğini anlamasına yardımcı olmak için özel kanalınıza özel bir izleme kaynağı adı belirtmeniz kesinlikle önerilir.

İzleme Görüntüleyicisi ile tümleştirme

Kanalınız tarafından oluşturulan izlemeler, izleme dinleyicisi olarak kullanılarak System.Diagnostics.XmlWriterTraceListener Hizmet İzleme Görüntüleyicisi Aracı (SvcTraceViewer.exe) tarafından okunabilir bir biçimde çıkış yapılabilir. Bu, kanal geliştiricisi olarak yapmanız gereken bir şey değildir. Bunun yerine, uygulamanın yapılandırma dosyasında bu izleme dinleyicisini yapılandırması gereken uygulama kullanıcısı (veya uygulamada sorun gideren kişi). Örneğin, aşağıdaki yapılandırma hem hem de System.ServiceModelMicrosoft.Samples.Udp adlı TraceEventsFile.e2edosyadan izleme bilgilerini çıkarmaktadır:

<configuration>  
  <system.diagnostics>  
    <sources>  
      <!-- configure System.ServiceModel trace source -->  
      <source name="System.ServiceModel" switchValue="Verbose"
              propagateActivity="true">  
        <listeners>  
          <add name="e2e" />  
        </listeners>  
      </source>  
      <!-- configure Microsoft.Samples.Udp trace source -->  
      <source name="Microsoft.Samples.Udp" switchValue="Verbose" >  
        <listeners>  
          <add name="e2e" />  
        </listeners>  
      </source>  
    </sources>  
    <!--   
    Define a shared trace listener that outputs to TraceFile.e2e  
    The listener name is e2e   
    -->  
    <sharedListeners>  
      <add name="e2e" type="System.Diagnostics.XmlWriterTraceListener"  
        initializeData=".\TraceFile.e2e"/>  
    </sharedListeners>  
    <trace autoflush="true" />  
  </system.diagnostics>  
</configuration>  

Yapılandırılmış Verileri İzleme

System.Diagnostics.TraceSource , izleme girişine dahil edilecek bir veya daha fazla nesne alan bir TraceData yönteme sahiptir. Genel olarak, Object.ToString yöntemi her nesnede çağrılır ve sonuçta elde edilen dize izleme girişinin bir parçası olarak yazılır. izlemelerini çıktı olarak kullanırken System.Diagnostics.XmlWriterTraceListener , veri nesnesi olarak öğesini System.Xml.XPath.IXPathNavigable öğesine TraceDatageçirebilirsiniz. Sonuçta elde edilen izleme girdisi tarafından sağlanan XML'yi System.Xml.XPath.XPathNavigatoriçerir. XML uygulama verilerini içeren örnek bir giriş aşağıda verilmiştir:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">  
  <System xmlns="...">  
    <EventID>12</EventID>  
    <Type>3</Type>  
    <SubType Name="Information">0</SubType>  
    <Level>8</Level>  
    <TimeCreated SystemTime="2006-01-13T22:58:03.0654832Z" />  
    <Source Name="Microsoft.ServiceModel.Samples.Udp" />  
    <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />  
    <Execution  ProcessName="UdpTestConsole"
                ProcessID="3348" ThreadID="4" />  
    <Channel />  
    <Computer>COMPUTER-LT01</Computer>  
  </System>  
<!-- XML application data -->  
  <ApplicationData>  
  <TraceData>  
   <DataItem>  
   <TraceRecord
     Severity="Information"  
     xmlns="…">  
        <TraceIdentifier>some trace id</TraceIdentifier>  
        <Description>EndReceive called</Description>  
        <AppDomain>UdpTestConsole.exe</AppDomain>  
        <Source>UdpInputChannel</Source>  
      </TraceRecord>  
    </DataItem>  
  </TraceData>  
  </ApplicationData>  
</E2ETraceEvent>  

WCF izleme görüntüleyicisi daha önce gösterilen öğenin şemasını TraceRecord anlar ve alt öğelerinden verileri ayıklar ve tablo biçiminde görüntüler. Kanalınız, kullanıcıların verileri okumasına Svctraceviewer.exe yardımcı olmak için yapılandırılmış uygulama verilerini izlerken bu şemayı kullanmalıdır.