[英]Catch Custom Exception from ASMX Web Service
我有一个Web服务,我在其中创建了一个自定义异常。 假设此异常的名称是InvalidContractException。
我想要做的是,如果发生特定步骤,我想抛出此异常。 但是,我无法弄清楚客户端如何捕获InvalidContractException以便正确处理它。
这是一个用C#编写的ASP.Net Web服务
你不能这样做:
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.