繁体   English   中英

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

[英]Catch Custom Exception from ASMX Web Service

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

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

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

你不能这样做:

  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";
    }
}

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

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

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

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

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

在您的客户端调用抛出Fault的WCF服务时,您可以

试试..

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

结束尝试

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

_

 <FaultContract(GetType(FooBarFault))> _

 Function yourCall

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM