通过Web服务正确捕获特定exception

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

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

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

正确的方法是定义故障合同。 例如,在您的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(faultContract); } } } 

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

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

达林有正确的答案。 我只会明确说明他的含义:Web服务不会传递exception。 它们返回SOAP Faults。 如果你正确地定义了你的错误,那么你就会抛出FaultException < fault >。 这将成为详细信息元素中出现故障的SOAP Fault。 对于.NET客户端,这将转换为FaultException < fault >,您可以捕获它。

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