Strategie obsługi wyjątków WCF

Tworzymy serwer proxy w WCF, który będzie służył jako środek komunikacji dla niektórych urządzeń przenośnych uruchamiających naszą niestandardową aplikację kliencką. Jestem ciekaw, jakie strategie obsługi błędów używają ludzie, ponieważ wolałbym nie owijać każdego połączenia proxy w try / catch.

Kiedy rozwijam ASP. net nie łapię większości WYJĄTKÓW, używam Application_Error w globalnym asax, który może następnie zarejestrować wyjątek, wysłać e-mail i przekierować użytkownika do niestandardowej strony docelowej błędu. To, czego szukam w WCF, jest podobne do tego, z tym, że pozwoliłoby mi to przekazać klientowi ogólny faultreason z centralnej lokalizacji.

W zasadzie jestem ciekaw jak ludzie centralizują obsługę wyjątków w aplikacjach WCF.

Thanks

Author: xximjasonxx, 2010-03-04

3 answers

Może się tu przydać interfejs Ierorhandler. Wykorzystaliśmy to do zrobienia prawie tego, o czym wspomniałeś - scentralizowanego rejestrowania wyjątków i podawania ogólnych przyczyn usterek bez konieczności zaśmiecania kodu licznymi próbami/połowami, aby spróbować rozwiązać problem lokalnie.

 22
Author: lee-m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 20:32:14

Oto, co zrobiłem. Mamy kilka niestandardowych WYJĄTKÓW w naszej aplikacji, takich jak BusinessRuleException i ProcessException, WCF obsługuje zarówno FaultException, jak i FaultException<T>.

Ogólna praktyka wydaje się być taka, że zawsze rzucasz FaultException klientowi w przypadku ogólnego błędu lub błędu, który nie chcesz wyświetlać dokładnie tego, co się stało. W innych przypadkach można przekazać FaultException<T> Gdzie T jest klasą z informacją o konkretnym wyjątku.

I created this pojęcie naruszenia w aplikacji, co zasadniczo oznaczało, że każdy niestandardowy wyjątek miał właściwość zawierającą odpowiednią instancję naruszenia. Ta instancja została następnie przekazana klientowi, umożliwiając klientowi rozpoznanie, kiedy wystąpił możliwy do odzyskania błąd.

To rozwiązało część problemu, ale nadal chciałem ogólnego złapać wszystko, co pozwoliłoby mi centralizować logowanie. Znalazłem to poprzez użycie interfejsu Ierorhandle i dodanie własnego niestandardowego programu obsługi błędów do WCF. Oto kod:

public class ServiceHostGeneralErrorHandler : IErrorHandler
{
    public void ProvideFault(Exception ex, MessageVersion version, ref Message fault)
    {
        if (ex is FaultException)
            return;

        // a general message to the client
        var faultException = new FaultException("A General Error Occured");
        MessageFault messageFault = faultException.CreateMessageFault();
        fault = Message.CreateMessage(version, messageFault, null);
    }

    public bool HandleError(Exception ex)
    {
        // log the exception

        // mark as handled
        return true;
    }
}

Za pomocą tej metody mogę przekonwertować wyjątek z tego, co to jest, na coś, co może być łatwo wyświetlane na kliencie, jednocześnie rejestrując prawdziwy wyjątek, aby personel IT mógł go zobaczyć. Jak na razie to podejście działa całkiem dobrze i ma taką samą strukturę jak inne moduły w aplikacji.

 15
Author: xximjasonxx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-16 18:55:05

Używamy blokowania aplikacji obsługujących wyjątki i chronimy większość błędów przed klientami, aby uniknąć ujawniania poufnych informacji, Ten artykuł może być dobrym punktem wyjścia dla ciebie, podobnie jak w przypadku "najlepszych praktyk" - powinieneś używać tego, co pasuje do Twojej domeny.

 2
Author: Ta01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 17:48:17