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

Jus*_*anz 9 c# web-services exception-handling asmx

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

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

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

Joh*_*ers 17

你不能这样做:

  1. Web服务执行SOAP错误.例外是特定于平台的.
  2. 在ASMX Web服务中未处理异常时,.NET会将其转换为SOAP Fault.异常的详细信息未序列化.
  3. 在ASMX客户端中,SOAP错误将转换为SoapException.

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,WCF客户端可以捕获FaultException<SomeOtherFault>.当我使用Java客户端尝试这个时,它能够捕获SomeOtherFaultIBM Rational Web Developer创建的派生自Java Exception类的内容.


Nad*_*zie 5

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

有一个有用的文章速效这里了解如何SoapException的工作.

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

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