Rozšíření kontroly nad zpracováním a vykazováním chyb

Ukázka ErrorHandling ukazuje, jak rozšířit kontrolu nad zpracováním chyb a hlášením chyb ve službě Windows Communication Foundation (WCF) pomocí IErrorHandler rozhraní. Ukázka je založená na části Začínáme s některými dalšími kódy přidanými do služby pro zpracování chyb. Klient vynutí několik chybových podmínek. Služba zachytí chyby a protokoluje je do souboru.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Služby můžou zachytit chyby, provádět zpracování a ovlivnit způsob hlášení chyb pomocí IErrorHandler rozhraní. Rozhraní má dvě metody, které lze implementovat: ProvideFault(Exception, MessageVersion, Message) a HandleError. Tato ProvideFault(Exception, MessageVersion, Message) metoda umožňuje přidat, upravit nebo potlačit chybovou zprávu vygenerovanou v reakci na výjimku. Tato HandleError metoda umožňuje zpracování chyb v případě chyby a řídí, zda se může spustit další zpracování chyb.

V této ukázce CalculatorErrorHandler typ implementuje IErrorHandler rozhraní. V okně

HandleErrorCalculatorErrorHandler zapíše protokol chyby do Error.txt textového souboru v c:\logs. Všimněte si, že ukázka zaznamená chybu do protokolu a nepotlačí ji, což umožňuje ho ohlásit zpět klientovi.

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

Existuje ErrorBehaviorAttribute jako mechanismus pro registraci obslužné rutiny chyby ve službě. Tento atribut přebírá jeden parametr typu. Tento typ by měl implementovat IErrorHandler rozhraní a měl by mít veřejný prázdný konstruktor. Atribut pak vytvoří instanci tohoto typu obslužné rutiny chyby a nainstaluje ji do služby. Provede to implementací IServiceBehavior rozhraní a následným použitím ApplyDispatchBehavior metody pro přidání instancí obslužné rutiny chyby do služby.

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

Ukázka implementuje službu kalkulačky. Klient záměrně způsobí, že ve službě dojde ke dvěma chybám poskytnutím parametrů s neplatnými hodnotami. Rozhraní CalculatorErrorHandler používá IErrorHandler k protokolování chyb do místního souboru a pak umožňuje jejich hlášení zpět klientovi. Klient vynutí dělení nulou a podmínku argumentu mimo rozsah.

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

Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Zobrazí se dělení nulou a informace o stavu mimo rozsah, které jsou hlášeny jako chyby. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.

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.

Soubor c:\logs\errors.txt obsahuje informace protokolované o chybách službou. Upozorňujeme, že aby služba zapisovala do adresáře, musíte zajistit, aby proces, ve kterém je služba spuštěná (obvykle ASP.NET nebo síťová služba), měl oprávnění k zápisu do adresáře.

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

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.

  3. Ujistěte se, že jste vytvořili adresář c:\logs pro error.txt soubor. Nebo upravte název souboru použitý v CalculatorErrorHandler.HandleErrorsouboru .

  4. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.