WCF-błędy / wyjątki a komunikaty

Prowadzimy obecnie dyskusję, czy lepiej rzucać błędy na kanał WCF, zamiast przekazywać komunikat wskazujący status lub odpowiedź z usługi.

Błędy są dostarczane z wbudowaną obsługą WCF, gdzie możesz użyć wbudowanych procedur obsługi błędów i odpowiednio reagować. Wiąże się to jednak z kosztami, ponieważ wyrzucanie WYJĄTKÓW w. Net może być dość kosztowne.

Wiadomości mogą zawierać informacje niezbędne do ustalenia, co się stało z Twoim połączeniem serwisowym bez zbędnego rzucania WYJĄTKÓW. Potrzebuje jednak kilku linii powtarzającego się kodu, aby przeanalizować wiadomość i określić działania podążające za jej zawartością.

Podjęliśmy próbę stworzenia ogólnego obiektu Wiadomości, który moglibyśmy wykorzystać w naszych usługach, i oto, co wymyśliliśmy:

public class ReturnItemDTO<T>
{
    [DataMember]
    public bool Success { get; set; }

    [DataMember]
    public string ErrorMessage { get; set; }

    [DataMember]
    public T Item { get; set; }
}

Jeśli wszystkie moje usługi wywołują zwrot tego przedmiotu, mogę konsekwentnie sprawdzić właściwość "sukces", aby określić, czy wszystko poszło dobrze. Następnie otrzymuję komunikat o błędzie w zdarzeniu wskazując coś poszło nie tak, i ogólny element zawierający Dto w razie potrzeby.

Informacje o wyjątkach będą musiały zostać zalogowane do centralnej usługi logowania i nie będą przekazywane z powrotem z usługi.

Myśli? Komentarze? Pomysły? Sugestie?

Kilka dalszych wyjaśnień na moje pytanie

Problem, który mam z kontraktami winnymi, to komunikowanie zasad biznesowych.

Jeśli ktoś się zaloguje, a jego konto jest zablokowane, Jak mogę komunikować? Ich login oczywiście nie działa, ale nie działa z powodu "zablokowania konta".

Ja też:

A) użyj logiki, wyrzuć błąd z zablokowanym kontem wiadomości

B) return AuthenticatedDTO with relevant information

Author: Peter Mortensen, 2008-09-17

3 answers

Wiąże się to jednak z kosztami, ponieważ wyrzucanie WYJĄTKÓW w. Net może być dość kosztowne.

Serializujesz i de-serializujesz obiekty do XML i wysyłasz je przez powolną sieć.. przewaga z rzucania wyjątku jest Niedbała w porównaniu z tym.

Zazwyczaj trzymam się rzucania wyjątków, ponieważ wyraźnie komunikują, że coś poszło nie tak i wszystkie zestawy narzędzi webservice mają dobry sposób na ich obsługę.

W Twojej próbce rzuciłbym Nieautoryzowanyaccessexception z Komunikatem "konto zablokowane".

Wyjaśnienie: usługi. NET wcf domyślnie tłumaczą wyjątki na FaultContracts, ale możesz zmienić to zachowanie. MSDN: określanie i obsługa błędów w umowach i usługach

 31
Author: Paul van Brenk,
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
2008-09-17 09:58:24

Jeśli myślisz o wywołaniu usługi jak wywołanie jakiejkolwiek innej metody, może to pomóc spojrzeć na sprawy z perspektywy. Wyobraź sobie, że każda wywołana metoda zwraca status, a Ty to do ciebie, aby sprawdzić, czy to prawda lub FAŁSZ. To byłoby dość nudne.

result = CallMethod();
if (!result.Success) handleError();

result = CallAnotherMethod();
if (!result.Success) handleError();

result = NotAgain();
if (!result.Success) handleError();

Jest to jeden z mocnych punktów ustrukturyzowanego systemu obsługi błędów, jest to, że można oddzielić rzeczywistą logikę od obsługi błędów. Nie musisz ciągle sprawdzać, wiesz, że to był sukces, jeśli nie ma wyjątku został wyrzucony.

try 
{
    CallMethod();
    CallAnotherMethod();
    NotAgain();
}
catch (Exception e)
{
    handleError();
}
Jednocześnie zwracając wynik, nakładasz większą odpowiedzialność na klienta. Możesz dobrze wiedzieć, aby sprawdzić błędy w obiekcie wynikowym, ale John Doe przychodzi i po prostu zaczyna dzwonić do twojego serwisu, nie wiedząc, że coś jest nie tak, ponieważ wyjątek nie jest wyrzucany. Jest to kolejna wielka siła wyjątków jest to, że dają nam dobry policzek w twarz, gdy coś jest nie tak i trzeba się nimi zająć.
 6
Author: Despertar,
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
2012-09-25 05:39:43

Poważnie rozważyłbym użycie obiektów FaultContract i FaultException, aby to obejść. Pozwoli to na przekazanie znaczących komunikatów o błędach z powrotem do klienta, ale tylko wtedy, gdy wystąpi warunek błędu.

Niestety, jestem w tej chwili na szkoleniu, więc nie mogę napisać pełnej odpowiedzi, ale na szczęście uczę się zarządzania wyjątkami w aplikacjach WCF. Napiszę dzisiaj więcej informacji. (Sorry to słaba odpowiedź)

 0
Author: ZombieSheep,
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
2008-09-17 09:13:39