我有一个网络服务,我在其中创建了一个自定义异常。假设此异常的名称是 InvalidContractException。
我想做的是,如果发生特定步骤,我想抛出这个异常。但是,我无法弄清楚客户端如何捕获 InvalidContractException 以便正确处理它。
这是一个用 C# 编写的 ASP.Net Web 服务
最佳答案
你不能这样做:
- Web 服务处理 SOAP 故障。异常是特定于平台的。
- 当 ASMX 网络服务中的异常未得到处理时,.NET 会将其转换为 SOAP 错误。异常详情未序列化。
- 在 ASMX 客户端中,SOAP 错误将被转换为 SoapException。
ASMX 网络服务没有对 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 创建以派生自 Java Exception
类。
关于c# - 从 ASMX Web 服务捕获自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296679/