从ASMX Web服务捕获自定义异常

时间:2009-08-18 21:38:13

标签: c# exception-handling asmx web-services

我有一个Web服务,我在其中创建了一个自定义异常。假设此异常的名称是InvalidContractException。

我想要做的是,如果发生特定步骤,我想抛出此异常。但是,我无法弄清楚客户端如何捕获InvalidContractException以便正确处理它。

这是一个用C#编写的ASP.Net Web服务

3 个答案:

答案 0 :(得分:17)

你不能这样做:

  1. Web服务执行SOAP错误。例外是特定于平台的。
  2. 当ASMX Web服务中未处理异常时,.NET会将其转换为SOAP Fault。异常的详细信息未序列化。
  3. 在ASMX客户端中,SOAP错误将转换为SoapException。
  4. ASMX Web服务没有对​​SOAP Faults的适当支持。除了客户端的SoapException之外,没有办法获得任何异常。

    升级到WCF的另一个原因。


    作为不能对ASMX做的事情的一个例子,这里是WCF的工作方式。 WCF允许您为每个Web服务操作指定它可以返回哪些错误:

    [ServiceContract]
    public interface IMyServiceContract
    {
        [FaultContract(typeof(IntegerZeroFault))]
        [FaultContract(typeof(SomeOtherFault))]
        [OperationContract]
        public string GetSomeString(int someInteger);
    }
    
    [DataContract]
    public class IntegerZeroFault
    {
        [DataMember]
        public string WhichInteger {get;set;}
    }
    
    [DataContract]
    public class SomeOtherFault
    {
        [DataMember]
        public string ErrorMessage {get;set;}
    }
    
    public class MyService : IMyServiceContract
    {
        public string GetSomeString(int someInteger)
        {
            if (someInteger == 0) 
                throw new FaultException<IntegerZeroFault>(
                    new IntegerZeroFault{WhichInteger="someInteger"});
            if (someInteger != 42)
                throw new FaultException<SomeOtherFault>(
                    new SomeOtherFault{ErrorMessage ="That's not the anaswer"});
            return "Don't panic";
        }
    }
    

    例如,WCF客户端可以捕获FaultException<SomeOtherFault>。当我用Java客户端尝试这个时,它能够捕获SomeOtherFault,IBM Rational Web Developer创建它来自Java Exception类。

答案 1 :(得分:5)

如果您的目标是抛出异常,以便用户可以知道出现了问题,发生了一些特定的异常并对其进行了特殊处理,那么您确实有一个选项。您只需依赖客户端代理的正确实现(实际上,一种选择是自己提供客户端代理)。

有一篇有用的文章here提供SoapException的工作方式。

本质上,它归结为在SoapException的详细信息节点中编码异常详细信息(例如错误代码),然后在重新抛出异常之前在客户端解析它。

没有办法重新创建异常就像它被抛出服务边界一样,除了客户端的SoapException之外,没有任何自动方法可以获取任何东西。

答案 2 :(得分:0)

在客户端调用抛出Fault的WCF服务时,执行

试试..

将FaultException捕获为FaultException(Of YourService.FooBarFault)

结束尝试

您必须为可能产生错误的服务方法声明FaultContract,例如

_

 <FaultContract(GetType(FooBarFault))> _

 Function yourCall