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