Почему Enterprise Library не выдает FaultException в WCF

Я использую сервис WCF, размещенный на IIS.
Кроме того, я использую контракты ошибок для отправки ошибок клиенту (FaultException<'T>)
На стороне клиента я ловлю FaultException<'T>, чтобы показать некоторую ошибку пользователю.
Если на сервере генерируется какое-то необработанное исключение, WCF генерирует обычное исключение FaultException, поэтому клиент ловит его и показывает пользователю сообщение "Внутренняя ошибка сервера".

Затем я начал использовать Enterprise Library 5.0 для экранирования исключений WCF и столкнулся со следующей проблемой. Используя FaultContractExceptionHandler, можно переносить все ошибки на клиента, но в случае необработанного исключения клиент получает CommunicationException вместо FaultException. Все остальное работает нормально.

Если я отключил политику обработки исключений (удалите атрибут Exception Shielding), клиент будет перехватывать исключения FaultExceptions, как и ожидалось.
Вы знаете, в чем может быть причина?
Благодарю.

PS: вот цепочка внутренних исключений:
CommunicationException -> WebException -> IOException -> SocketException
Сообщение "Базовое соединение было закрыто: соединение, которое, как предполагалось, будет сохранено живым, было закрыто сервером".

Web.config

<add name="ServiceException Policy">
    <exceptionTypes>
      <add name="ServiceLogicException" type="LopService.Contracts.ServiceLogicException, LopService.Contracts, Version=1.0.0.1725, Culture=neutral, PublicKeyToken=null"
        postHandlingAction="ThrowNewException">
        <exceptionHandlers>
          <add type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.FaultContractExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            faultContractType="LopService.Contracts.ServiceLogicFaultContract, LopService.Contracts, Version=1.0.0.1725, Culture=neutral, PublicKeyToken=null"
            name="Fault Contract Exception Handler" />
        </exceptionHandlers>
      </add>
    </exceptionTypes>
  </add>

Класс обслуживания

[ExceptionShielding("ServiceException Policy")]
public partial class LopSoapService
{...

Операционный договор

    [OperationContract]
    [FaultContract(typeof(DataValidationFaultContract))]
    [FaultContract(typeof(ServiceLogicFaultContract))]
    int CreateUser(UserDto userDto, IEnumerable<ClaimRecordDto> claimRecords);

1 ответ

Похоже, это проблема корпоративной библиотеки. Смотрите этот рабочий элемент.

Другие вопросы по тегам