2009-10-05 59 views
5

我正在将代码从ASMX转换为WCF。在我的ASMX Web服务我扔回去SOAP异常,如:应该使用WCF服务抛出什么样的异常类型?

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

我丢回给WCF客户端调用我的服务是什么样的异常?我猜测SOAP除了是一种错误的类型,因为测试客户端并不认为它是一个有效的错误,而只是说 - 在Web服务中发生了内部错误。

回答

20

基本上,在WCF服务中,当您仅丢弃FaultException(或FaultException<T>)时,您会处于最佳状态。

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

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

如果你想(或必须)是非常互操作,那么您需要定义您的SOAP错误错误契约(类似于数据合同)在一个单独的文件,然后你会扔FaultException<T>其中T是你的错误合同之一。如果你在任何一方都严格控制.NET,那么你也可以将.NET异常插入到FaultException中作为泛型类型T,如果你愿意的话 - 通道不会出错(例如,你可以抛出一个FaultException<InvalidOperationException>,错误)。

+1

一个很好的解释,我希望我可以upvote两次。谢谢。 – Noich 2013-03-03 10:03:50

3

在WCF中使用FaultException。例如参见here

+0

+1分享一流的例子。 – SBirthare 2013-08-28 07:09:16

相关问题