Я использую IErrorHandler, чтобы сделать обработку исключений в WCF, и теперь я хочу зарегистрировать исключения, наряду с отслеживанием стека и пользователем, который вызвал исключение.
Единственный путь I видит для получения пользователя, который вызвал исключение:
OperationContext. Текущий. IncomingMessageProperties. Безопасность. ServiceSecurityContext. PrimaryIdentity
... Но это только, кажется, работает в ProvideFault, и не в HandleError. Существует ли способ получить пользователя в HandleError? Я хотел бы использовать HandleError вместо ProvideFault, поскольку это обратилось к фоновому потоку и означало для регистрации ошибок, правильно?
Два метода IErrorHandler имеют довольно четко определенные обязанности:
HandleError здесь, чтобы обрабатывать все неперехваченные исключения - вот почему это лучшее место для ведения журнала - это действительно его причина быть
ProvideFault должен превратить ваше исключение .NET в совместимую ошибку SOAP - или полностью проигнорировать исключение
Конечно, технически ничто не мешает вам выполнить запись в методе ProvideFault
- это просто не то место, куда я бы пошел искать эту функциональность, если бы мне когда-нибудь пришлось ее искать. Я предпочитаю следовать принципу наименьшего удивления - если метод называется ProvideFault
, я ожидаю, что он предоставит только FaultException
, а не многое другое. , тоже.
Чтобы получить доступ к контексту безопасности вашей службы, используйте этот фрагмент кода:
ServiceSecurityContext secCtx = ServiceSecurityContext.Current;
if(secCtx.PrimaryIdentity != null)
{
// do something with primary identity
}