Я использую службу 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);