Megosztás a következőn keresztül:


A hibakezelés és a jelentéskészítés vezérlésének kiterjesztése

Az ErrorHandling minta bemutatja, hogyan terjeszthető ki a hibakezelés és a hibajelentés szabályozása a Windows Communication Foundation (WCF) szolgáltatásban az IErrorHandler interfész használatával. A minta az első lépéseken alapul, és néhány további kódot ad hozzá a szolgáltatáshoz a hibák kezeléséhez. Az ügyfél számos hibafeltételt kényszerít ki. A szolgáltatás elfogja a hibákat, és naplózza őket egy fájlban.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

A szolgáltatások képesek elfogni a hibákat, feldolgozni és befolyásolni a hibák jelentésének módját az IErrorHandler interfész használatával. Az interfésznek két metódusa van, amelyek implementálhatók: ProvideFault(Exception, MessageVersion, Message) és HandleError. A ProvideFault(Exception, MessageVersion, Message) metódus lehetővé teszi egy kivételre válaszul létrehozott hibaüzenet hozzáadását, módosítását vagy letiltését. A HandleError módszer lehetővé teszi a hibafeldolgozást hiba esetén, és meghatározza, hogy a további hibakezelés futtatható-e.

Ebben a mintában a CalculatorErrorHandler típus implementálja az interfészt IErrorHandler . A

HandleError metódus, a CalculatorErrorHandler hiba naplóját írja egy Error.txt szövegfájlba a c:\logs fájlban. Vegye figyelembe, hogy a minta naplózza a hibát, és nem tiltja el, lehetővé téve, hogy a hiba vissza legyen jelentve az ügyfélnek.

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;
    }
}

Ez ErrorBehaviorAttribute egy olyan mechanizmus, amellyel hibakezelőt regisztrálhat egy szolgáltatásban. Ez az attribútum egyetlen típusparamétert vesz igénybe. Ennek a típusnak implementálnia kell az interfészt IErrorHandler , és nyilvános, üres konstruktorsal kell rendelkeznie. Az attribútum ezután példányosítja a hibakezelő típus egy példányát, és telepíti azt a szolgáltatásba. Ezt úgy teszi, hogy implementálja az IServiceBehavior interfészt, majd a ApplyDispatchBehavior metódus használatával hozzáadja a hibakezelő példányait a szolgáltatáshoz.

// 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);
        }
    }
}

A minta egy számológép szolgáltatást implementál. Az ügyfél szándékosan két hibát okoz a szolgáltatásban azáltal, hogy érvénytelen értékeket ad meg a paramétereknek. A CalculatorErrorHandler felület használatával IErrorHandler naplózza a hibákat egy helyi fájlban, majd lehetővé teszi, hogy azokat vissza lehessen jelenteni az ügyfélnek. Az ügyfél nullával való osztást és argumentumtartományon kívüli feltételt kényszerít ki.

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);
}

A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. A nullával való osztás és a tartományon kívüli argumentumfeltételek hibaként lesznek jelentve. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

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.

A c:\logs\errors.txt fájl tartalmazza a szolgáltatás által naplózott hibákat. Vegye figyelembe, hogy ahhoz, hogy a szolgáltatás a címtárba írjon, győződjön meg arról, hogy a szolgáltatás futtatásának folyamata (általában ASP.NET vagy hálózati szolgáltatás) rendelkezik engedéllyel a címtárba való íráshoz.

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

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

  3. Győződjön meg arról, hogy létrehozta a c:\logs könyvtárat a error.txt fájlhoz. Vagy módosítsa a fájlnevet.CalculatorErrorHandler.HandleError

  4. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.