Web服务中的例外

问题描述:

我的团队正在开发一个基于服务(.NET WCF)的应用程序,我们正在尝试确定如何处理内部服务中的异常。我们应该抛出异常吗?返回序列化为XML的异常?只需返回一个错误代码?Web服务中的例外

请记住,用户永远不会看到这些例外情况,它仅适用于应用程序的其他部分。

WCF使用SoapFaults作为从服务到客户端或从客户端到服务的异常传输方式。

您可以在合同接口使用FaultContract属性声明自定义SOAP错误:

例如:

[ServiceContract(Namespace="foobar")] 
interface IContract 
{ 
    [OperationContract] 
    [FaultContract(typeof(CustomFault))] 
    void DoSomething(); 
} 


[DataContract(Namespace="Foobar")] 
class CustomFault 
{ 
    [DataMember] 
    public string error; 

    public CustomFault(string err) 
    { 
     error = err; 
    } 
} 

class myService : IContract 
{ 
    public void DoSomething() 
    { 
     throw new FaultException<CustomFault>(new CustomFault("Custom Exception!")); 
    } 
} 

我有点困惑,我不是轻浮 - 你说你想返回序列化为XML的异常,另一方面用户永远不会看到异常。谁会看到这些例外情况?

通常我会说使用WCF故障契约。

那么,为什么不只是抛出标准的SOAPExceptions?错误代码和序列化XML的问题在于它们都需要额外的逻辑来识别实际发生的错误。这种方法仅在您需要在Web服务的另一端进行专门的日志记录或逻辑时才有用。这样一个例子会返回一个标志,表示“可以继续”并显示错误异常报告。

无论你如何抛出它,它都不会让工作变得更容易,因为主叫方仍需要认识到存在异常并处理它。

Phil,应用程序的不同部分使用WCF相互调用。通过“返回异常序列化为XML”,我的意思是函数的返回值将是一个异常对象。成功将由null表示。

我不认为这是正确的选择。

WCF故障合同听起来不错,但我对他们一无所知。现在检查谷歌。

我会避免发送异常直接返回给客户端,除非你是好与很多细节被送回。

我会建议使用WCF错误来传输错误消息和代码(可以用来决定接收方重试,出错等),具体取决于错误发送方还是接收方。

这可以使用FaultCode.CreateReceiverFaultCode和FaultCode.CreateSenderFaultCode来完成。

我正在通过此权利的过程中,但遇到了一个讨厌的障碍,似乎在WCF故障生成的SOAP 1.1响应。如果你有兴趣,你可以看看我的问题在这里:

.NET WCF faults generating incorrect SOAP 1.1 faultcode values