【问题标题】:Catch Custom Exception from ASMX Web Service从 ASMX Web 服务捕获自定义异常
【发布时间】:2009-08-18 21:38:13
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你不能这样做:

    1. Web 服务执行 SOAP 错误。例外情况因平台而异。
    2. 当 ASMX Web 服务中未处理异常时,.NET 会将其转换为 SOAP 错误。异常的详细信息未序列化。
    3. 在 ASMX 客户端中,SOAP 错误将被转换为 SoapException。

    ASMX Web 服务对 SOAP 错误没有适当的支持。除了客户端的 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&lt;SomeOtherFault&gt;,例如。当我用 Java 客户端尝试这个时,它能够捕获 SomeOtherFault,这是 IBM Rational Web Developer 创建的从 Java Exception 类派生的。

    【讨论】:

      【解决方案2】:

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

      here 上有一篇有用的文章,介绍了 SoapExceptions 的工作原理。

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

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

      【讨论】:

        【解决方案3】:

        在您的客户端调用引发错误的 WCF 服务时,您可以这样做

        试试..

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

        结束尝试

        你必须为可以产生故障的服务方法声明一个FaultContract,例如

        _

         <FaultContract(GetType(FooBarFault))> _
        
         Function yourCall
        

        【讨论】:

        • 他正在使用 ASMX。他称之为“ASP.NET Web 服务”
        • 啊好吧..我以为他在使用 WCF
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 1970-01-01
        • 2014-01-20
        • 2019-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多