我使用托管在 IIS 上的 WCF 服务。
此外,我使用故障合同将错误发送到客户端(FaultException<'T>)
在客户端,我捕获FaultException<'T>以向用户显示一些错误。
如果在服务器上抛出了一些未处理的异常,WCF 会生成普通的FaultException,因此客户端会捕获它并显示用户“内部服务器错误”消息。
然后我开始使用 Enterprise Library 5.0 for WCF Exception Shielding,遇到了以下问题。使用FaultContractExceptionHandler可以将所有错误传递给客户端,但如果出现未处理的异常,客户端会收到CommunicationException而不是FaultException。其他一切正常。
如果我关闭异常处理策略(删除 ExceptionShielding 属性),客户端会按预期捕获FaultExceptions 。
你知道可能是什么原因吗?
谢谢。
PS:这是一个内部异常链:
CommunicationException -> WebException -> IOException -> SocketException
消息是“底层连接已关闭:预期保持活动的连接已被服务器关闭。”
网页配置
<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);