代码之家  ›  专栏  ›  技术社区  ›  Christian P.

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

  •  1
  • Christian P.  · 技术社区  · 17 年前

    问题是Web服务捕获这些错误并将其序列化为FaultException,实际异常(如NoroomAvailableException)写在消息字段中。

    我的问题是,是否有处理这些错误的最佳实践。我们刚刚开始这方面的工作,我们可能会做一些文本模式匹配来提取异常类型和错误消息,但这似乎是一种黑客的方式,所以任何“干净”的方式都会非常感激。

    2 回复  |  直到 17 年前
        1
  •  2
  •   Darin Dimitrov    17 年前

    [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);
    }
    
        2
  •  0
  •   John Saunders    17 年前

    达林有正确的答案。我只想明确地说出他的意思:web服务不会传递异常。它们返回SOAP错误。如果你像他那样正确地定义了你的错误,那么你就可以抛出FaultException< 过错 过错 在细节元素中。如果是.NET客户端,则会将其转换为FaultException< >,你能抓住的。

    其他平台的处理方式可能有所不同。我见过IBM的RationalWebDeveloper生成Java代理代码,为每个声明的错误创建一个单独的异常。这是Java泛型之前的一个版本,所以现在它可能和.NET做了同样的事情。