2009-08-18 58 views
9

我有一个Web服务,其中创建了一个自定义异常。假设这个异常的名字是InvalidContractException。从ASMX Web服务捕捉自定义异常

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

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

回答

17

你不能做到这一点:

  1. Web服务做SOAP错误。例外情况是特定于平台的。
  2. 当在ASMX Web服务中未处理异常时,.NET会将其转换为SOAP Fault。该例外的细节未被序列化。
  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<SomeOtherFault>,例如。当我使用Java客户端尝试了这个功能时,它能够捕获SomeOtherFault,IBM Rational Web Developer创建该SomeOtherFault以从Java Exception类派生。

0

在您的客户端调用抛出故障WCF服务,你做

尝试..

抓错为的FaultException(的YourService.FooBarFault)

末尝试

您必须声明FaultContract为能够产生次服务方法e故障,例如

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

他正在使用ASMX。他称之为“ASP.NET Web服务” – 2009-08-18 21:53:18

+0

好的..我以为他使用的是WCF – 2009-08-18 22:55:05

5

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

有一篇有用的文章可用here关于如何SoapException的工作。

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

无法重新创建异常,就好像它在服务边界上抛出一样,除了客户端的SoapException外,没有任何自动获取方式可以获取任何内容。