我有一个Web服务,其中创建了一个自定义异常。假设这个异常的名字是InvalidContractException。从ASMX Web服务捕捉自定义异常
我想要做的是如果发生特定的步骤,我想抛出这个异常。但是,我无法弄清楚客户端如何捕获InvalidContractException以正确处理它。
这是一个ASP.Net Web服务用C#编写
我有一个Web服务,其中创建了一个自定义异常。假设这个异常的名字是InvalidContractException。从ASMX Web服务捕捉自定义异常
我想要做的是如果发生特定的步骤,我想抛出这个异常。但是,我无法弄清楚客户端如何捕获InvalidContractException以正确处理它。
这是一个ASP.Net Web服务用C#编写
你不能做到这一点:
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
类派生。
在您的客户端调用抛出故障WCF服务,你做
尝试..
抓错为的FaultException(的YourService.FooBarFault)
末尝试
您必须声明FaultContract为能够产生次服务方法e故障,例如
_
<FaultContract(GetType(FooBarFault))> _
Function yourCall
如果您的目标是抛出一个异常,以便用户可以知道出现问题,发生了一些特定的异常并对其进行了特殊处理,您可以选择。你只需要依靠客户端代理的正确实现(实际上,一种选择是自己提供客户端代理)。
有一篇有用的文章可用here关于如何SoapException
的工作。
本质上,它归结为在SoapException
的详细节点中编码异常详细信息(例如错误代码),然后在重新抛出异常之前在客户端解析它。
无法重新创建异常,就好像它在服务边界上抛出一样,除了客户端的SoapException外,没有任何自动获取方式可以获取任何内容。
他正在使用ASMX。他称之为“ASP.NET Web服务” – 2009-08-18 21:53:18
好的..我以为他使用的是WCF – 2009-08-18 22:55:05