通过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一样。