我正在将代码从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服务中发生内部错误。
答案 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。