我有一个Web服务,我在其中创建了一个自定义异常。假设此异常的名称是InvalidContractException。
我想要做的是,如果发生特定步骤,我想抛出此异常。但是,我无法弄清楚客户端如何捕获InvalidContractException以便正确处理它。
这是一个用C#编写的ASP.Net Web服务
答案 0 :(得分:17)
你不能这样做:
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
类。
答案 1 :(得分:5)
如果您的目标是抛出异常,以便用户可以知道出现了问题,发生了一些特定的异常并对其进行了特殊处理,那么您确实有一个选项。您只需依赖客户端代理的正确实现(实际上,一种选择是自己提供客户端代理)。
有一篇有用的文章here提供SoapException
的工作方式。
本质上,它归结为在SoapException
的详细信息节点中编码异常详细信息(例如错误代码),然后在重新抛出异常之前在客户端解析它。
没有办法重新创建异常就像它被抛出服务边界一样,除了客户端的SoapException之外,没有任何自动方法可以获取任何东西。
答案 2 :(得分:0)
在客户端调用抛出Fault的WCF服务时,执行
试试..
将FaultException捕获为FaultException(Of YourService.FooBarFault)
结束尝试
您必须为可能产生错误的服务方法声明FaultContract,例如
_
<FaultContract(GetType(FooBarFault))> _
Function yourCall