Aracılığıyla paylaş


Hata İşleme ve Bildirme Denetimini Genişletme

ErrorHandling örneği, arabirimini kullanarak bir Windows Communication Foundation (WCF) hizmetinde hata işleme ve hata raporlama üzerinde denetimi genişletmeyi IErrorHandler gösterir. Örnek, hataları işlemek için hizmete eklenen bazı ek kodlarla çalışmaya başlamayı temel alır. İstemci birkaç hata koşulunu zorlar. Hizmet hataları durdurur ve bir dosyada günlüğe kaydeder.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Hizmetler hataları kesebilir, işleme gerçekleştirebilir ve arabirim kullanılarak hataların nasıl bildirildiğine IErrorHandler etki edebilir. Arabiriminin uygulanabilecek iki yöntemi vardır: ProvideFault(Exception, MessageVersion, Message) ve HandleError. ProvideFault(Exception, MessageVersion, Message) yöntemi, bir özel duruma yanıt olarak oluşturulan hata iletisini eklemenize, değiştirmenize veya gizlemenize olanak tanır. yöntemi, HandleError hata durumunda hata işlemenin gerçekleştirilmesini sağlar ve ek hata işlemenin çalıştırılıp çalıştırılamayacağını denetler.

Bu örnekte türü CalculatorErrorHandler arabirimini IErrorHandler uygular. İçinde

HandleError yöntemi, CalculatorErrorHandler c:\logs içindeki bir Error.txt metin dosyasına hatanın günlüğünü yazar. Örneğin hatayı günlüğe kaydedip gizlemediğini ve istemciye geri bildirilmesine izin vermediğini unutmayın.

public class CalculatorErrorHandler : IErrorHandler
{
    // Provide a fault. The Message fault parameter can be replaced, or set to
    // null to suppress reporting a fault.

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
    }

    // HandleError. Log an error, then allow the error to be handled as usual.
    // Return true if the error is considered as already handled

    public bool HandleError(Exception error)
    {
        using (TextWriter tw = File.AppendText(@"c:\logs\error.txt"))
        {
            if (error != null)
            {
                tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message);
            }
            tw.Close();
        }
        return true;
    }
}

, ErrorBehaviorAttribute bir hata işleyicisini bir hizmete kaydetme mekanizması olarak bulunur. Bu öznitelik tek bir tür parametresi alır. Bu tür arabirimi uygulamalı IErrorHandler ve genel, boş bir oluşturucuya sahip olmalıdır. Öznitelik daha sonra bu hata işleyici türünün bir örneğini oluşturur ve hizmete yükler. Bunu, arabirimini IServiceBehavior uygulayarak ve ardından hata işleyicisinin örneklerini hizmete eklemek için yöntemini kullanarak ApplyDispatchBehavior yapar.

// This attribute can be used to install a custom error handler for a service.
public class ErrorBehaviorAttribute : Attribute, IServiceBehavior
{
    Type errorHandlerType;

    public ErrorBehaviorAttribute(Type errorHandlerType)
    {
        this.errorHandlerType = errorHandlerType;
    }

    void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
    {
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
    {
        IErrorHandler errorHandler;

        try
        {
            errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
        }
        catch (MissingMethodException e)
        {
            throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must have a public empty constructor.", e);
        }
        catch (InvalidCastException e)
        {
            throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must implement System.ServiceModel.Dispatcher.IErrorHandler.", e);
        }

        foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
        {
            ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
            channelDispatcher.ErrorHandlers.Add(errorHandler);
        }
    }
}

Örnek bir hesap makinesi hizmeti uygular. İstemci, geçersiz değerlerle parametreler sağlayarak hizmette kasıtlı olarak iki hata oluşmasına neden olur. , CalculatorErrorHandler hataları yerel bir dosyaya günlüğe kaydetmek için arabirimini kullanır IErrorHandler ve ardından istemciye geri bildirilmesine izin verir. İstemci, bir bölmeyi sıfıra ve bağımsız değişken aralık dışı koşula zorlar.

try
{
    Console.WriteLine("Forcing an error in Divide");
    // Call the Divide service operation - trigger a divide by 0 error.
    value1 = 22;
    value2 = 0;
    result = proxy.Divide(value1, value2);
    Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
}
catch (FaultException e)
{
    Console.WriteLine("FaultException: " + e.GetType().Name + " - " + e.Message);
}
catch (Exception e)
{
    Console.WriteLine("Exception: " + e.GetType().Name + " - " + e.Message);
}

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. Sıfıra bölmeyi ve aralık dışı bağımsız değişken koşullarının hata olarak bildirildiğini görürsünüz. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.

Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
Forcing an error in Divide
FaultException: FaultException - Invalid Argument: The second argument must not be zero.
Forcing an error in Factorial
FaultException: FaultException - Invalid Argument: The argument must be greater than zero.

Press <ENTER> to terminate client.

c:\logs\errors.txt dosyası, hizmet tarafından hatalar hakkında günlüğe kaydedilen bilgileri içerir. Hizmetin dizine yazabilmesi için, hizmetin çalıştığı işlemin (genellikle ASP.NET veya Ağ Hizmeti) dizine yazma iznine sahip olduğundan emin olmanız gerektiğini unutmayın.

Fault: Reason = Invalid Argument: The second argument must not be zero.
Fault: Reason = Invalid Argument: The argument must be greater than zero.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  3. error.txt dosyası için c:\logs dizinini oluşturduğunuzdan emin olun. veya içinde CalculatorErrorHandler.HandleErrorkullanılan dosya adını değiştirebilirsiniz.

  4. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.