【发布时间】:2012-01-23 21:40:18
【问题描述】:
我有一个与数据库对话的 WCF 服务。所有操作都通过服务进行。 向客户端返回异常的最佳方式是什么(在本例中为 WPF 应用程序)。
假设我在返回客户列表的服务中有 GetCustomer。但这有一个例外。我应该如何将此异常返回给客户?
【问题讨论】:
标签: .net wcf .net-4.0 wcf-client
我有一个与数据库对话的 WCF 服务。所有操作都通过服务进行。 向客户端返回异常的最佳方式是什么(在本例中为 WPF 应用程序)。
假设我在返回客户列表的服务中有 GetCustomer。但这有一个例外。我应该如何将此异常返回给客户?
【问题讨论】:
标签: .net wcf .net-4.0 wcf-client
一种方法是让有关任何潜在例外情况的信息成为您的服务合同的一部分。因此,在您的示例中,GetCustomer 返回您的客户列表。但它也返回一组可能为空的关于发生的任何异常的数据。这是一个好主意,因为并非您的服务的每个使用者都将成为 .NET 应用程序,依赖发送 .NET 错误是不明智的。
【讨论】:
Microsoft 建议针对 WCF 异常实现 IErrorHandler
显式控制应用程序的行为,当 抛出异常,实现IErrorHandler接口并添加 到 ErrorHandlers 属性。 IErrorHandler 使您能够显式地 控制生成的 SOAP 故障,决定是否将其发送回 客户端,并执行相关的任务,例如记录。错误 处理程序按照它们添加到 ErrorHandlers 属性。
实现 ProvideFault 方法来控制故障信息 返回给客户。
实现 HandleError 方法以确保与错误相关的行为, 包括错误记录、确保快速失败、关闭 应用程序等等。
Here 是比 MSDN 更好的示例
IMyService proxy = ...; //Get proxy from somewhere
try {
proxy.MyMethod();
}
catch (CommunicationException) { ... }
catch (TimeoutException) { ... }
catch (FaultException<MyApplicationFault> myFault) {
MyApplicationFault detail = myFault.Detail;
//Do something with the actual fault
}
catch (FaultException otherFault) { ... }
【讨论】: