Регистрация исключений в WCF с IErrorHandler внутри HandleError или ProvideFault? - PullRequest
6 голосов
/ 20 мая 2010

Я использую IErrorHandler для обработки исключений в WCF, и теперь я хочу регистрировать исключения вместе с трассировкой стека и пользователем, вызвавшим исключение.

Единственный способ узнать, как вызвать пользователя, вызвавшего исключение:

OperationContext.Current.IncomingMessageProperties.Security.ServiceSecurityContext.PrimaryIdentity

... Но, похоже, это работает только внутри ProvideFault, а не внутри HandleError. Есть ли способ получить пользователя внутри HandleError? Я хотел бы использовать HandleError вместо ProvideFault, так как он вызывается в фоновом потоке и предназначен для регистрации ошибок, верно?

1 Ответ

3 голосов
/ 20 мая 2010

Два метода IErrorHandler имеют довольно четко определенные обязанности:

  • HandleError здесь для обработки всех необъяснимых исключений - вот почему это лучшее место для ведения журналов - в этом и заключается его причина быть

  • ProvideFault поручено превратить ваше исключение .NET в совместимую ошибку SOAP - или полностью исключить исключение

Конечно, технически ничто не мешает вам заняться регистрацией в методе ProvideFault - это просто не то место, где я мог бы искать эту функциональность, если бы мне когда-либо приходилось ее искать. Я склонен следовать принципу наименьшего удивления - если метод называется ProvideFault, я только ожидаю, что он обеспечит FaultException<T> - и не будет делать много других вещей.

Чтобы получить доступ к контексту безопасности вашей службы, используйте этот фрагмент кода:

ServiceSecurityContext secCtx = ServiceSecurityContext.Current;

if(secCtx.PrimaryIdentity != null)
{
   // do something with primary identity
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...