2010-05-19 8 views
6

Używam IErrorHandler do obsługi wyjątków w WCF i teraz chcę rejestrować wyjątki, wraz ze śledzeniem stosu i użytkownikiem, który spowodował wyjątek.Wypisywanie wyjątków w WCF z IErrorHandler wewnątrz HandleError lub ProvideFault?

Jedynym sposobem, widzę, aby użytkownik, który spowodował wyjątek jest:

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

... Ale to tylko wydaje się działać wewnątrz ProvideFault , a nie wewnątrz HandleError. Czy istnieje sposób na przeniesienie użytkownika do HandleError? Chciałbym użyć HandleError zamiast ProvideFault, ponieważ jest to wywoływane w wątku tła i przeznaczone do rejestrowania błędów, prawda?

Odpowiedz

3

dwóch metod IErrorHandler już dość dobrze zdefiniowane obowiązki:

  • HandleError jest tutaj, aby obsłużyć wszystkie przechwycone wyjątki - właśnie dlatego, że to najlepsze miejsce, aby wykonać logowania - to naprawdę cała jego przyczyną być

  • ProvideFault ma za zadanie odwracać się wyjątek .NET do interoperacyjnej winy SOAP - albo ignorować wyjątek alltogether

Oczywiście, nie ma nic Cię powstrzymuje od technicznie robi swoje rejestrowanie w metodzie ProvideFault - to po prostu nie jest to miejsce pójdę szukać tej funkcji, jeśli kiedykolwiek musiał szukać. Staram się postępować zgodnie z zasadą najmniejszej niespodzianki - jeśli metoda nazywa się ProvideFault, oczekuję tylko, że dostarczy ona FaultException<T> - nie zrobię też wielu innych rzeczy.

Aby uzyskać dostęp do kontekstu zabezpieczeń Twojego serwisu, należy użyć tego fragmentu kodu:

ServiceSecurityContext secCtx = ServiceSecurityContext.Current; 

if(secCtx.PrimaryIdentity != null) 
{ 
    // do something with primary identity 
} 
+0

zgadzam, ale w jaki sposób można uzyskać informacje użytkownika (ServiceSecurityContext.PrimaryIdentity) od wewnątrz metody HandleError? – Dannerbo

+0

@Dannerbo: zaktualizowałem moją odpowiedź –

+8

W moim środowisku uzyskującym dostęp do ServiceSecurityContext.Current w HandleError() wyrzuca ObjectDisposedException z tekstem "Message is closed". – UserControl

Powiązane problemy