Почему Enterprise Library не вызывает FaultException в WCF - PullRequest
1 голос
/ 20 января 2012

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

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

Если я отключил политику обработки исключений (удалите атрибут ExceptionShielding), клиент перехватит 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 Ответ

0 голосов
/ 21 января 2012

Это, похоже, проблема с Enterprise Library. Посмотреть это рабочий элемент .

...