应该使用WCF服务抛出什么异常类型?

时间:2009-10-05 13:09:21

标签: wcf

我正在将代码从ASMX转换为WCF。在我的ASMX Web服务中,我抛弃了SOAP异常,如:

if (ex.InnerException != null)
                {
                    SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException);
                    throw se;
                }

我应该向WCF客户端调用我的服务返回什么样的例外?我猜SOAP除了错误的类型,因为测试客户端不会将其视为有效错误,只是说 - Web服务中发生内部错误。

2 个答案:

答案 0 :(得分:20)

基本上,在WCF服务中,当你只抛出FaultException(或FaultException<T>)时,你最好。

这是因为两件事:因为WCF被设计为可互操作(您的客户端可以很容易地成为非.NET应用程序),所以您不应该使用.NET异常 - 这些异常太特定于平台。第二个:如果使用FaultExceptions(转换为SOAP错误),您的通道(客户端和服务器之间的连接)将不会被拆除或“出现故障”。服务器端的WCF运行时将所有未处理的.NET异常视为“严重”异常,从而将通道置于故障状态,假设发生了非常糟糕的事情。

如果您的频道出现故障,则无法再使用它 - 您必须关闭客户端代理并从头开始重新创建。

如果您希望(或必须)具有很强的互操作性,您可以在单独的文件中定义SOAP错误 fault contracts (类似于数据协定),然后抛出{ {1}}其中T将是您的错误合同之一。如果您在任何一方都严格使用.NET,那么您也可以将.NET异常作为通用类型T粘贴到FaultException中,如果您愿意 - 通道不会出现故障(例如,您可以抛出FaultException<T>因此发出错误信号。

答案 1 :(得分:3)

在WCF中,您使用FaultException。请参阅示例here