У меня есть служба Windows, которая взаимодействует со службами WCF. Все службы WCF защищены от сбоев и генерируют пользовательские UserFaultContracts и ServiceFaultContracts. Там нет проблем.
В службе Windows я использую EntLib для обработки исключений и ведения журнала.
Я не хочу пробовать ловить при неисправностях
try
{
}
catch (FaultException<UserFaultContract>)
{
}
Я хочу использовать EntLib
try
{
}
catch (Exception ex)
{
var rethrow = ExceptionPolicy.HandleException(ex, "Transaction Policy");
if (rethrow) throw;
}
Это также работает, однако, в моей Политике Tranasaction я хочу Записать детали UserFaultContract. Это где я склеен. И я ненавижу, когда меня расклеивают. Ошибка фиксируется и регистрируется ... но я не могу получить подробную информацию о ней.
Моя политика исключений
<add name="Transaction Policy">
<exceptionTypes>
<add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="None" name="Exception">
<exceptionHandlers>
<add logCategory="General" eventId="200" severity="Error" title="Transaction Error"
formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
priority="2" useDefaultLogger="true" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="Logging Handler" />
</exceptionHandlers>
</add>
<add type="System.ServiceModel.FaultException, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="None" name="FaultException">
<exceptionHandlers>
<add logCategory="General" eventId="200" severity="Error" title="Service Fault"
formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
priority="2" useDefaultLogger="true" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="Logging Handler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
Зарегистрировано исключение:
Метка времени: 13.05.2010 14:53:40
Сообщение: HandlingInstanceID: e9038634-e16e-4d87-ab1e-92379431838b
Исключение типа 'System.ServiceModel.FaultException`1 [[LCI.DispatchMaster.FaultContracts.ServiceFaultContract, LCI.DispatchMaster.FaultContracts, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]]' возникло и было пойманы.
05/13/2010 10:53:40
Тип: System.ServiceModel.FaultException`1 [[LCI.DispatchMaster.FaultContracts.ServiceFaultContract, LCI.DispatchMaster.FaultContracts, Версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null]], System.ServiceModel, версия = 3.0.0.0 , Культура = нейтральный, PublicKeyToken = b77a5c561934e089
Сообщение. Произошла внутренняя ошибка службы DispatchMaster.
Источник: mscorlib
Справочная ссылка:
Деталь: LCI.DispatchMaster.FaultContracts.ServiceFaultContract
Действие: http://LCI.DispatchMaster.LogicalChoices.com/ITruckMasterService/MergeScenarioServiceFaultContractFault
Код: System.ServiceModel.FaultCode
Причина: произошла внутренняя ошибка в службе DispatchMaster.
Данные: System.Collections.ListDictionaryInternal
TargetSite: Void HandleReturnMessage (System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage)
Трассировка стека:
В контакте неисправности есть ID и сообщение. Как вы видите, мне бы хотелось, чтобы идентификатор и сообщение регистрировались EntLib.
Я предполагаю, что мне придется написать собственный обработчик для извлечения подробностей ошибки - но подумал, что я спрошу, если я что-то упустил в EntLib, что может помочь мне избежать этой задачи.
Спасибо всем, кто готов помочь.