通过Web服务正确捕获特定异常

时间:2009-05-13 09:33:27

标签: c# web-services exception-handling

我目前在客户端程序中使用C#.NET服务。作为服务器设计的一部分,抛出了几个自定义异常以指示特定错误(如在任何普通桌面程序中)。

问题是Web Service捕获这些错误并将它们序列化为FaultException,并在Message字段中写入实际异常(如NoRoomsAvailableException)。

我的问题是,是否有处理这些错误的最佳做法。我们刚刚开始研究这个问题,我们可能会做一些文本模式匹配来提取异常类型和错误消息,但这似乎是一种hacky方式,所以任何“干净”的做法都会很多赞赏。

2 个答案:

答案 0 :(得分:2)

正确的方法是定义故障合同。例如,在您的Web服务中,您可以执行以下操作:

[DataContract]
public class NoRoomsAvailableFaultContract
{
    [DataMember]
    public string Message { get; set; }
}

接下来,您为给定的服务操作声明此合同

[ServiceContract]
public interface IMyServiceContract
{
    [OperationContract]
    [FaultContract(typeof(NoRoomsAvailableFaultContract))]
    void MyOperation();
}

你实现它是这样的:

public class MyService : IMyServiceContract 
{
    public void MyOperation()
    {
        if (somethingWentWrong)
        {
            var faultContract = new NoRoomsAvailableFaultContract()
            {
                Message = "ERROR MESSAGE"
            };
            throw new FaultException<NoRoomsAvailableFaultContract>(faultContract);
        }
    }
}

在这种情况下,NoRoomsAvailableFaultContract将在WSDL中公开,svcutil.exe可以生成代理类。然后你可以捕获这个例外:

try
{
    myServiceProxy.MyOperation();
}
catch (FaultException<NoRoomsAvailableFaultContract> ex)
{
    Console.WriteLine(ex.Message);
}

答案 1 :(得分:0)

达林有正确的答案。我只会明确说明他的含义:Web服务不会传递异常。它们返回SOAP Faults。如果你正确地定义了你的错误,那么你就会抛出FaultException&lt; fault &gt;。这将成为detail元素中带有 fault 的SOAP Fault。对于.NET客户端,这将变为FaultException&lt; fault &gt;,您可以捕获它。

其他平台可能会有所不同。我见过IBM的Rational Web Developer生成Java代理代码,为每个声明的错误创建一个单独的异常。那是Java泛型之前的一个版本,所以也许到现在它和.NET一样。