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

JL.*_*JL. 5 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;
                }
Run Code Online (Sandbox Code Playgroud)

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

mar*_*c_s 20

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

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

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

如果你想(或必须)是非常可互操作的,你可以在一个单独的文件中定义你的SOAP故障是故障契约(类似于数据契约),然后你扔掉FaultException<T> T将成为你的一个错误契约.如果您在任何一方都严格使用.NET,那么您也可以将.NET异常作为通用类型T粘贴到FaultException中,如果您愿意 - 通道不会出现故障(例如,您可以抛出一个FaultException<InvalidOperationException>,从而发出错误信号) ).